2012-10-02 15 views
58

Можно создать дубликат:
What does BigInteger having no limit mean?Есть ли верхняя граница для BigInteger?

Javadoc для BigInteger не определяет никакого максимума или минимума. Тем не менее, он говорит: (курсив добавлен)

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

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

+0

В _теории_ нет предела. –

+1

Принятый ответ в этом возможном дубликате не указывает теоретический предел 'BigInteger'; или, если у него его действительно нет, он не объясняет, почему. Вместо этого он просто говорит, что если * * максимальный, он никогда не повлияет на вас с ограничениями текущей памяти. – asteri

+0

Вероятно, в базе 2, поэтому max равен (2^32)^Integer.MAX_VALUE в базе 2. – Ran

ответ

50

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

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


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

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

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

+4

Поскольку значения используются как значения без знака 'int', максимальное значение больше похоже на' (2^32)^Integer.MAX_VALUE * 10^Integer.MAX_VALUE', поскольку оно также можно масштабировать. –

+1

@PeterLawrey Вы уверены, что есть масштаб для BigInteger? (есть один для BigDecimal). – assylias

+1

Поскольку целое число MAX_VALUE составляет приблизительно 2^31, максимальное значение не может храниться в 32-разрядной памяти компьютера :) Таким образом, память является пределом. –

10

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

+7

В полной справедливости вам просто нужно больше логики для печати это –

+2

Если его использовать несколько строк, вы можете использовать несколько BigIntegers.;) –

+3

Правда, но это вызовет гораздо больше осложнений в вашем коде, чем просто программа печати. –

17

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

От here.

Он реализован с использованием 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; 

От the source

Из статьи Википедии Arbitrary-precision arithmetic:

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

Смежные вопросы