2012-10-02 31 views
58

Duplicar posible:
What does BigInteger having no limit mean?¿Hay un límite superior para BigInteger?

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

(énfasis añadido)

Inmutable precisión arbitraria enteros

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

+0

En _theory_ no hay límite. –

+1

La respuesta aceptada en ese posible duplicado no especifica el límite teórico de 'BigInteger'; o, si realmente no tiene uno, no explica por qué. En cambio, simplemente dice que si there * is * a maximum, nunca lo afectará con las limitaciones de memoria actuales. – asteri

+0

Probablemente esté en la base 2, por lo que el máximo es (2^32)^Integer.MAX_VALUE en la base 2. – Ran

Respuesta

50

El número se almacena en int[] - el tamaño máximo de una matriz es Integer.MAX_VALUE. Entonces, el máximo de BigInteger probablemente es (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 añadió algo de información a the BigInteger javadoc, dando un rango mínimo soportado y el límite real de la implementación actual:

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

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

+4

Como los valores se usan como valores 'int' sin signo, el máximo es más parecido a' (2^32)^Integer.MAX_VALUE * 10^Integer.MAX_VALUE', ya que también se puede escalar. –

+1

@PeterLawrey ¿Estás seguro de que hay una escala para BigInteger? (hay uno para BigDecimal). – assylias

+1

Dado que el entero MAX_VALUE es aproximadamente 2^31, el valor máximo no puede mantenerse en la memoria de la computadora de 32 bits :) Por lo tanto, la memoria es el límite. –

10

La primera máxima que golpear es la longitud de una cadena que está a 2 -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.

+7

Con toda justicia, solo necesitarías más lógica para imprimir –

+2

Si está bien utilizar múltiples cadenas, también podría utilizar múltiples BigIntegers.;) –

+3

Es cierto, pero eso causaría muchas más complicaciones en el código que solo la rutina de impresión. –

17

BigInteger sólo se utiliza si usted sabe que no será un decimal y hay una posibilidad de que los datos de tipo largo de no ser lo suficientemente grande. BigInteger no tiene límite en su tamaño máximo (tan grande como la memoria RAM en la computadora puede contener).

De 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 the source

del artículo de Wikipedia Arbitrary-precision arithmetic:

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

Cuestiones relacionadas