Есть ли верхняя граница для BigInteger?
Возможный дубликат:
Что означает BigInteger без ограничения?
Javadoc для BigInteger
не определяет максимальный или минимальный. Однако он говорит:
(выделено курсивом)
Неизменяемые целые числа произвольной точности
Есть ли такой максимум, даже в теории? Или способ BigInteger
работает принципиально иначе, так что на самом деле нет максимума, кроме объема памяти, доступного на компьютере?
Ответы
Ответ 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 он теряет большую часть своего значения, если его нельзя распечатать.