java - example - ¿Hay un límite superior para BigInteger?
int to biginteger java (3)
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 here .
Se implementa utilizando un 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;
De la fuente
Del artículo de Wikipedia Aritmética de precisión arbitraria :
Varios lenguajes de programació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.
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
arrojanArithmeticException
cuando el resultado está fuera del rango admitido de-2
Integer.MAX_VALUE
(exclusivo) a+2
Integer.MAX_VALUE
(exclusivo).
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.