golang中math/big包支持的最大值是多少?
What's the largest value supported by the math/big package in golang?
我正在阅读 math/big 包的文档:
https://golang.org/pkg/math/big/#pkg-constants
我试图了解一个数字对于 math.big 来说太大了多少,这看起来像是我可以询问的常数。
我在我的机器上看到:
fmt.Println(math.MaxUint32)
4294967295
为了计算的目的,这与我机器上可能的最大整数有什么关系?这个数字的单位是什么?这是字节、小数位还是数字本身以外的其他东西?
bignum libraries usually store big numbers as a sequence of digits (e.g. in base 264). Their limitation is related to the memory available. So the largest number you could represent is tied to the limitation of your virtual address space. You can safely assume that a number even as large as 1010000 is representable in bignum. Of course, a googolplex 不能表示为 bignum(因为它的位数多于宇宙中的粒子数)。
另一个限制是算术运算的复杂性。但是存在非常有效的 bignum 算法。
FWIW,GMPlib(bignums 的 C 库)只要有内存就可以处理数字。然而,有传言说当 malloc
失败时,GMPlib 正在中止。
我不知道当数字太大而无法表示时 Go bignums 内部会发生什么(并且该限制因一台机器而异,并且可能与一台 运行 下一台不同)。例如,Go 的 Int.Mul 给出了一个乘积,其大小是参数大小的总和,而 "out of memory" 错误是没有记录的(但显然 可以 发生) .
使用大数时,更喜欢迭代算法而不是递归算法。例如,一个简单的递归阶乘可能会溢出具有足够大的 bignums 的调用堆栈,因此您想对其进行迭代编码。
我正在阅读 math/big 包的文档:
https://golang.org/pkg/math/big/#pkg-constants
我试图了解一个数字对于 math.big 来说太大了多少,这看起来像是我可以询问的常数。
我在我的机器上看到:
fmt.Println(math.MaxUint32)
4294967295
为了计算的目的,这与我机器上可能的最大整数有什么关系?这个数字的单位是什么?这是字节、小数位还是数字本身以外的其他东西?
bignum libraries usually store big numbers as a sequence of digits (e.g. in base 264). Their limitation is related to the memory available. So the largest number you could represent is tied to the limitation of your virtual address space. You can safely assume that a number even as large as 1010000 is representable in bignum. Of course, a googolplex 不能表示为 bignum(因为它的位数多于宇宙中的粒子数)。
另一个限制是算术运算的复杂性。但是存在非常有效的 bignum 算法。
FWIW,GMPlib(bignums 的 C 库)只要有内存就可以处理数字。然而,有传言说当 malloc
失败时,GMPlib 正在中止。
我不知道当数字太大而无法表示时 Go bignums 内部会发生什么(并且该限制因一台机器而异,并且可能与一台 运行 下一台不同)。例如,Go 的 Int.Mul 给出了一个乘积,其大小是参数大小的总和,而 "out of memory" 错误是没有记录的(但显然 可以 发生) .
使用大数时,更喜欢迭代算法而不是递归算法。例如,一个简单的递归阶乘可能会溢出具有足够大的 bignums 的调用堆栈,因此您想对其进行迭代编码。