Подтвердить что ты не робот

Есть ли верхняя граница для BigInteger?

Возможный дубликат:
Что означает BigInteger без ограничения?

Javadoc для BigInteger не определяет максимальный или минимальный. Однако он говорит:

(выделено курсивом)

Неизменяемые целые числа произвольной точности

Есть ли такой максимум, даже в теории? Или способ BigInteger работает принципиально иначе, так что на самом деле нет максимума, кроме объема памяти, доступного на компьютере?

4b9b3361

Ответ 1

Число хранится в int[] - максимальный размер массива равен Integer.MAX_VALUE. Таким образом, максимальный BigInteger, вероятно, (2 ^ 32) ^ Integer.MAX_VALUE.

По общему признанию, это зависит от реализации, а не от спецификации.


В Java 8 некоторая информация была добавлена ​​в BigInteger javadoc, предоставляя минимальный поддерживаемый диапазон и фактический предел текущей реализации:

BigInteger должен поддерживать значения в диапазоне -2 Integer.MAX_VALUE (эксклюзивно) до +2 Integer.MAX_VALUE (исключение) и может поддерживать значения за пределами этого диапазона.

Замечание по реализации: конструкторы и операции BigInteger throw ArithmeticException, когда результат выходит за пределы поддерживаемого диапазона -2 Integer.MAX_VALUE (исключение) до +2 Integer.MAX_VALUE (эксклюзивно).

Ответ 2

BigInteger будет использоваться, только если вы знаете, что он не будет десятичным и существует вероятность того, что длинный тип данных не будет достаточно большим. BigInteger не имеет ограничений по максимальному размеру (размером с RAM на компьютер может удерживать).

От здесь.

Он реализуется с помощью int[]:

  110       /**
  111        * The magnitude of this BigInteger, in <i>big-endian</i> order: the
  112        * zeroth element of this array is the most-significant int of the
  113        * magnitude.  The magnitude must be "minimal" in that the most-significant
  114        * int ({@code mag[0]}) must be non-zero.  This is necessary to
  115        * ensure that there is exactly one representation for each BigInteger
  116        * value.  Note that this implies that the BigInteger zero has a
  117        * zero-length mag array.
  118        */
  119       final int[] mag;

Из источника

Из статьи Википедии Арифметика с произвольной точностью:

Несколько современных языков программирования имеют встроенную поддержку для bignums и другие имеют библиотеки, доступные для произвольной точности целочисленная и с плавающей запятой. Вместо того, чтобы хранить значения как фиксированные количество двоичных битов, связанных с размером регистра процессора, эти реализации обычно используют массивы переменной длины цифр.

Ответ 3

Первый максимум, на который вы попали, - это длина строки, которая составляет 2 31 -1 цифр. Он намного меньше максимума BigInteger, но IMHO он теряет большую часть своего значения, если его нельзя распечатать.