BigInteger 没有限制是什么意思?

59

我研究了这个与大整数相关的StackOverflow问题,特别是我不理解这行话(斜体字):

在BigInteger类中,我没有限制,并且有一些有用的函数,但将您的美丽代码转换为与BigInteger类一起工作真的很令人沮丧,特别是当原始操作符在那里无法使用时,您必须使用此类的函数。

我不知道自己错过了什么,但要表示没有限制的东西,您需要无限的内存吗?这里有什么诀窍?


参见:https://dev59.com/tGcs5IYBdhLWcg3woVd-#12693333 - assylias
4个回答

93

没有理论上的限制。BigInteger类会为其请求保存的所有数据位分配所需的内存。

然而,由可用内存所决定存在一些实际限制。还有进一步的技术限制,尽管你很不可能受到影响:一些方法假设这些位可以通过int索引进行寻址,因此当超过Integer.MAX_VALUE位时,事情将开始破裂。


1
这很像一个字符串或byte[](尽管我认为它们在技术上仅限于整数可寻址元素)。 - Thilo
2
@Thilo:BigInteger也是如此:数据存储在int[]中,这会对它能表示的数字大小产生理论限制。 - Michael Borgwardt
2
@MichaelBorgwardt 背后的 int[] 数组肯定是一种实现细节,而不是指定行为,对吧? - Graham Borland
6
Java中的数组目前只能有2^32个元素。有些人希望能有2^64个元素。BigInteger将其位存储在int[]中,因此它最多只能存储2^32个整数,即2^37位。相当大。 - Thilo
7
@Graham Borland: backing int[] 是实现细节,但是 BigInteger API 有多个使用 int 参数访问第 n 位的方法,并且 toString() 方法间接地限制了 BigInteger 实现的理论数量级,因为数字必须能够表示为字符串。因此,BigInteger 的大小不能超过 2^(2^31-1)-1,这比支持它的 int 数组所施加的限制要小得多。 - jarnbjo
显示剩余7条评论

18

Graham给出了很好的答案。我只想补充一点,就是在使用valueOf方法时要小心,因为它是使用long参数创建的,所以最大值是Long.MAX_VALUE


3
可以接受长参数的构造函数显然无法超出限制,但是有使用字符串或字节数组作为参数的构造函数。 - Thilo
1
没有公共构造函数以long作为参数。只有一个getter(文档中警告可能会丢失信息)。 - martijno
4
如果你尝试写一个超过 Long.MAX_VALUE 的字面量,BigInteger.valueOf(long) 方法会导致编译错误,所以不需要太小心谨慎。此外,构造一个远大于 Long.MAX_VALUE 的 BigInteger 非常容易,例如 BigInteger.valueOf(10).pow(10000) - leonbloy

6

当我们需要使用任意精度的大数字时,就会使用它。需要注意的是,“任意”精度或数字位数并不意味着“无限制”,而是指数字中的位数或计算中的精度位数受内存和/或我们指定的精度限制所限。


3
看一下 BigInteger 类的源代码,你会看到它使用 int 数组来表示数字(可以用 NetBean 实现)。例如,10113 将被表示为 [1, 0, 1, 1, 3](这并不是 BigInteger 类实际操作的方式,只是一个演示大数模块工作原理的例子)。因此,技术上,它的限制只在于你的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接