Каковы пределы BigDecimal и BigInteger?

Я умножал очень два огромных значения BigInteger в программе. Это не удалось. Каковы пределы BigInteger и BigDecimal ?


person Daanish    schedule 30.07.2013    source источник
comment
Вы уверены, что NumberFormatException возникает при умножении? Можете ли вы показать свой код? Проблема может быть в другом.   -  person mthmulders    schedule 30.07.2013
comment
multiply не бросает NumberFormatException. Покажи свой код...   -  person assylias    schedule 30.07.2013
comment
Мы действительно должны немедленно удалять вопросы, в которых кто-то сообщает об исключении, не публикуя трассировку стека. Однако это все же лучше, чем просто провал..   -  person Ingo    schedule 30.07.2013


Ответы (2)


Вы не получите NumberFormatException, умножая большие числа. Если полученное число слишком велико, вы получите загадочное исключение NegativeArraySizeException, поскольку размер массива переполняется.

У вас больше шансов получить ошибку нехватки памяти.

Предел составляет 32 * 2 ^ 32-1 бит для BigInteger или около 2 ^ (4 миллиарда).

Вы можете получить исключение NumberFormatException, если вы

  • создать BigInteger из пустого байта[]
  • используйте знак ‹ -1 или > +1
  • попробуйте разобрать число по основанию >36 или ‹ 2
  • есть строка с недопустимыми цифрами.

Когда вы получаете исключение, вы также должны посмотреть на сообщение и трассировку стека, поскольку это обычно дает вам реальную причину.

person Peter Lawrey    schedule 30.07.2013
comment
Означает ли это, что вы действительно можете иметь отрицательные индексы массива? В противном случае было бы 2^31-1 - person Ingo; 30.07.2013

ограничения быть не должно, кроме памяти, но может и есть, согласно реализации класса (например, какие-то поля там могут быть int или long).

person android developer    schedule 30.07.2013
comment
Как указал Питер, это ограничение является косвенным и вытекает из типа индексации массива: Int. Поскольку Big... поддерживается int[], у вас не может быть такого индекса, как 8888888888888888888888888888888888. (Но вы, скорее всего, получите OutOfMemory раньше). - person Ingo; 30.07.2013
comment
это потому, что максимальное количество элементов для массива, которое является оперативной памятью (хорошо, деленное на 4, что является размером int)? Интересно, сколько оперативной памяти необходимо для хранения этого количества. - person android developer; 30.07.2013
comment
На машине с 64-битным адресным пространством у вас может быть массив целых чисел размером 2^62. (и ничего больше) Но задолго до этого ограничения вступает в действие Java, потому что вы не можете использовать long для индексации массива. - person Ingo; 30.07.2013
comment
так что предел реализации - это то, что написал Питер (и он уменьшил его на 1 из-за отрицательных чисел)? - person android developer; 30.07.2013