go - golang 中的 math/big 包支持的最大值是多少?
问题描述
我在这里阅读 math/big 包的文档:
https://golang.org/pkg/math/big/#pkg-constants
我试图了解一个数字对于 math.big 来说太大了,这看起来像是一个我可以询问的常数。
我在我的机器上看到:
fmt.Println(math.MaxUint32)
4294967295
为了计算,这与我的机器上可能的最大整数有什么关系?这个数字的单位是什么?这是字节,还是小数位或数字本身以外的其他东西?
解决方案
bignum库通常将大数字存储为数字序列(例如以2 64为基数)。它们的限制与可用内存有关。因此,您可以表示的最大数字与您的虚拟地址空间的限制有关。您可以放心地假设一个大到 10 10000的数字也可以用 bignum 表示。当然,googolplex不能表示为 bignum(因为它的位数比宇宙中的粒子数多)。
另一个限制是算术运算的复杂性。但是存在非常有效的 bignum 算法。
FWIW,只要有内存,GMPlib (bignums 的 C 库)就可以处理数字。然而,有传言说当malloc
失败时,GMPlib 正在中止。
我不知道当数字太大而无法表示时 Go bignums 内部会发生什么(并且该限制因一台机器而异,并且可能因一次运行而异)。例如,Go 的Int.Mul给出了一个乘积,其大小是参数大小的总和,并且“内存不足”错误没有记录(但显然可能发生)。
使用 bignums 时,更喜欢迭代算法而不是递归算法。例如,一个简单的递归阶乘可能会使调用堆栈溢出足够大的 bignums,因此您希望对其进行迭代编码。
推荐阅读
- cmake - CMake:如何为每个目标指定不同的链接脚本
- android - 在 android 中使用 Glide 进行图像缓存
- asp.net - 找不到 TraceConfigruation 参考(StackDriver ASP.Net 设置)
- javascript - 在我的代码中,我有向上和向下箭头键工作,但由于某种原因左右似乎不工作
- python - 使用序列“:n”对 3D 矩阵进行 Numpy 切片与指定列“[0,1]”不同
- google-colaboratory - 错误:在 Colab 上运行 automl_gs 时,文件 b'tpu_train/metadata/results.csv' 不存在:b'tpu_train/metadata/results.csv'
- typescript - 如何在 TypeScript 严格模式下使用方括号表示法访问对象的属性
- java - 如何使用多线程来修复游戏中的 ConcurrentModificationExceptions 以进行移动和精灵创建?
- hyperledger-fabric - 如何在智能合约中管理多个资产?
- r - 如何在R中平均每两行数据帧