web-dev-qa-db-fra.com

Y at-il une limite supérieure à BigInteger?

Duplicate possible:
Que signifie BigInteger sans limite?

La Javadoc pour BigInteger ne définit pas de maximum ni de minimum. Cependant, cela dit:

(emphase ajoutée)

Immuable entiers à précision arbitraire

Existe-t-il un tel maximum, même en théorie? Ou bien la manière dont BigInteger fonctionne-t-elle de manière fondamentalement différente, de sorte qu'il existe en réalité non maximum, à l'exception de la quantité de mémoire disponible sur l'ordinateur?

72
asteri

Le numéro est contenu dans un int[] - la taille maximale d'un tableau est Integer.MAX_VALUE. Donc, le maximum BigInteger est probablement (2 ^ 32) ^ Integer.MAX_VALUE.

Certes, cela dépend de la mise en œuvre et ne fait pas partie de la spécification.


Dans Java 8, certaines informations ont été ajoutées à le BigInteger javadoc , donnant une plage minimale prise en charge et la limite réelle de l'implémentation actuelle:

BigInteger doit prendre en charge les valeurs comprises dans la plage -2Integer.MAX_VALUE (exclusif) to +2Integer.MAX_VALUE (exclusif) et peuvent prendre en charge des valeurs situées en dehors de cette plage.

Note d'implémentation: BigInteger constructeurs et opérations jettent ArithmeticException lorsque le résultat est en dehors de la plage prise en charge de -2Integer.MAX_VALUE (exclusif) to +2Integer.MAX_VALUE (exclusif).

67
assylias

BigInteger ne sera utilisé que si vous savez qu'il ne s'agira pas d'une décimale et qu'il est possible que le type de données long ne soit pas assez grand. BigInteger n'a pas de limite sur sa taille maximale (aussi grande que le RAM sur l'ordinateur peut contenir).

De ici .

Il est implémenté en utilisant 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 source

Extrait de l'article Wikipedia Arithmétique à précision arbitraire :

Plusieurs langages de programmation modernes prennent en charge les bignums, tandis que d'autres ont des bibliothèques disponibles pour les calculs entiers à précision arbitraire et les calculs à virgule flottante. Plutôt que de stocker des valeurs sous forme d'un nombre fixe de bits binaires liés à la taille du registre du processeur, ces implémentations utilisent généralement des tableaux de longueurs variables.

19
embedded.kyle

Le premier maximum que vous atteindriez est la longueur d’une chaîne qui est égale à 231-1 chiffres. C'est beaucoup plus petit que le maximum d'un BigInteger, mais à mon humble avis, il perd une grande partie de sa valeur s'il ne peut pas être imprimé.

10
Peter Lawrey