¿Hay un límite superior para BigInteger?

Posible duplicado:
¿Qué significa BigInteger sin límite?

El Javadoc para BigInteger no define ningún máximo o mínimo. Sin embargo, dice:

(énfasis añadido)

Enteros de precisión arbitraria inmutables

¿Existe tal máximo, incluso en teoría? ¿O la forma en que funciona BigInteger fundamentalmente diferente, de modo que en realidad no hay un máximo, excepto por la cantidad de memoria disponible en la computadora?

El número se mantiene en un int[] – el tamaño máximo de una matriz es Integer.MAX_VALUE . Entonces, el BigInteger máximo probablemente sea (2 ^ 32) ^ Integer.MAX_VALUE .

Es cierto que esto depende de la implementación, no es parte de la especificación.


En Java 8, se agregó cierta información al BigInteger javadoc , que proporciona un rango mínimo admitido y el límite real de la implementación actual:

BigInteger debe admitir valores en el rango -2 Integer.MAX_VALUE (exclusivo) a +2 Integer.MAX_VALUE (exclusivo) y puede admitir valores fuera de ese rango.

Nota de implementación: los constructores y las operaciones de BigInteger arrojan ArithmeticException cuando el resultado está fuera del rango admitido de -2 Integer.MAX_VALUE (exclusivo) a +2 Integer.MAX_VALUE (exclusivo).

BigInteger solo se usará si sabe que no será decimal y existe la posibilidad de que el tipo de datos largos no sea lo suficientemente grande. BigInteger no tiene límite en su tamaño máximo (tan grande como la RAM en la computadora puede contener).

Desde aquí .

Se implementa utilizando un int[] :

  110 /** 111 * The magnitude of this BigInteger, in big-endian 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; 

De la fuente

Del artículo de Wikipedia Aritmética de precisión arbitraria :

Varios lenguajes de progtwigción modernos tienen soporte incorporado para bignums, y otros tienen bibliotecas disponibles para enteros de precisión arbitraria y matemática de coma flotante. En lugar de almacenar valores como un número fijo de bits binarios relacionados con el tamaño del registro del procesador, estas implementaciones suelen utilizar matrices de dígitos de longitud variable.

El primer máximo que golpearía es la longitud de una Cadena que tiene 2 31 -1 dígitos. Es mucho más pequeño que el máximo de un BigInteger, pero en mi humilde opinión pierde gran parte de su valor si no se puede imprimir.