【问题标题】:What does BigInteger having no limit mean?BigInteger 没有限制是什么意思?
【发布时间】:2012-08-18 18:43:51
【问题描述】:

我查看了这个stackoverflow question relating to Big Integer,特别是我不明白这一行(斜体字):

在 BigInteger 类中,我没有限制并且有一些有用的 那里的功能,但转换你的美丽是非常令人沮丧的 使用 BigInteger 类的代码,特别是在原始时 运算符在那里不起作用,您必须使用此类中的函数。

我不知道我错过了什么,但要代表没有限制的东西,你需要无限的记忆吗?这里有什么诀窍?

【问题讨论】:

标签: java biginteger integer-overflow


【解决方案1】:

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

但是,存在一些实际限制,取决于可用内存。还有更多的技术限制,尽管你不太可能受到影响:一些方法假设这些位可以通过int 索引寻址,所以当你超过Integer.MAX_VALUE 位时,事情就会开始中断。

【讨论】:

  • 它非常像 String 或 byte[] 那样(虽然我认为这些在技术上仅限于整数可寻址元素)。
  • @Thilo:BigInteger 也是如此:数据保存在 int[] 中,这对它可以表示的数字大小设置了理论上的限制。
  • @MichaelBorgwardt 支持的 int[] 数组肯定是一个实现细节,而不是指定的行为,不是吗?
  • Java 中的数组目前只能有 2^32 个元素。有些人想要 2^64。 BigInteger 将其位存储在 int[] 中,因此它现在最多可以存储 2^32 个整数,即 2^37 位。相当大。
  • @Graham Borland:支持 int[] 是一个实现细节,但 BigInteger API 有几种使用 int 参数访问第 n 位的方法,而 toString() 方法间接限制了BigInteger 实现,因为数字必须可以表示为字符串。因此,BigInteger 不能大于 2^(2^31-1)-1,这远小于支持 int 数组所施加的限制。
【解决方案2】:

格雷厄姆对这个问题给出了很好的回答。我只想补充一点,您必须小心valueOf 方法,因为它是使用long 参数创建的,因此最大值为Long.MAX_VALUE

【讨论】:

  • 带long参数的显然不能超越,但也有带String或byte数组的构造函数。
  • 没有将long 作为参数的公共构造函数。只有一个吸气剂(带有有关在文档中丢失信息的警告)。
  • No real 不需要小心,因为如果您尝试编写超过 Long.MAX_VALUE 的文字,BigInteger.valueOf(long) 方法会给您一个编译错误。此外,很容易构造一个更大的 BigInteger,比如BigInteger.valueOf(10).pow(10000)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    看一下BigInteger 类的源代码,你会看到(可以用NetBean 完成)。一个数字将表示为一个 int 数组。例如,10113 将是 [1, 0, 1, 1, 3] (这并不是 BigInteger 类所做的,只是一个大数字模块如何工作的示例)。所以,从技术上讲,它唯一的限制就是你的记忆力。

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2019-09-12
      • 2015-01-22
      • 1970-01-01
      • 2020-10-27
      相关资源
      最近更新 更多