1198 votes

Valeurs maximales et minimales pour les entiers

Comment représenter les valeurs minimales et maximales pour les entiers en Python ? En Java, nous avons Integer.MIN_VALUE et Integer.MAX_VALUE.


Voir aussi : <a href="https://stackoverflow.com/questions/3477283">Quel est le flottant maximum en Python ?</a>.

21 votes

Notez que en Python 3, le type int est essentiellement le même que le type long en Python 2, donc l'idée d'un maximum ou d'un minimum int disparaît complètement. C'est fondamentalement sans importance même sur Python 2.

23 votes

@agf : cela peut être pertinent de différentes manières. Par exemple dans n'importe quel algorithme qui nécessite de sauvegarder la valeur minimale trouvée (comme un algorithme de tri). La valeur minimale pourrait être initialisée à sys.maxint, ce qui garantit que n'importe quelle première valeur trouvée est prise comme minimum

2 votes

@Toaster sauf que vous pouvez avoir une liste où toutes les valeurs sont supérieures à sys.maxint car c'est seulement le maximum pour le type int sur Python 2, que Python promouvra silencieusement en long.

1274voto

senderle Points 41607

Python 3

En Python 3, cette question ne s'applique pas. Le type int simple est non borné.

Cependant, vous pourriez en réalité chercher des informations sur la [taille des mots](https://en.wikipedia.org/wiki/Word(computer_architecture)#Table_of_wordsizes) de l'interpréteur actuel, qui sera la même que la taille des mots de la machine dans la plupart des cas. Cette information est toujours disponible en Python 3 avec sys.maxsize, qui est la valeur maximale représentable par un mot signé. De manière équivalente, c'est la taille de la liste la plus grande possible ou de la séquence en mémoire.

En général, la valeur maximale représentable par un mot non signé sera sys.maxsize * 2 + 1, et le nombre de bits dans un mot sera math.log2(sys.maxsize * 2 + 2). Voir cette réponse pour plus d'informations.

Python 2

En Python 2, la valeur maximale pour les valeurs int simples est disponible sous la forme de sys.maxint :

>>> sys.maxint  # sur mon système, 2**63-1
9223372036854775807

Vous pouvez calculer la valeur minimale avec -sys.maxint - 1 comme indiqué dans la documentation.

Python passe sans encombre des entiers simples aux entiers longs une fois que vous dépassez cette valeur. Donc la plupart du temps, vous n'aurez pas besoin de le savoir.

238 votes

Ce nombre peut sembler arbitraire, mais ce n'est pas le cas. 9223372036854775807 est exactement 2^63 - 1, donc vous avez un int de 64 bits. En général, un entier n-bits a des valeurs allant de -2^(n-1) à 2^(n-1) - 1.

30 votes

Notez que si vous utilisez un runtime Python 32 bits, sys.maxint renverra 2^31 - 1, même si Python passera de manière transparente à 64 bits avec le type de données long.

30 votes

Utilisez sys.maxsize à la place, comme suggéré par @Akash Rana. Il est également présent en Python 2, comme le disent les docs de sys. Cela rendra le code plus compatible avec les deux versions de Python.

518voto

Melle Points 2157

Si vous avez simplement besoin d'un nombre plus grand que tous les autres, vous pouvez utiliser

float('inf')

de manière similaire, un nombre plus petit que tous les autres :

float('-inf')

Cela fonctionne à la fois en python 2 et 3.

309voto

Akash Rana Points 301

La constante sys.maxint a été supprimée à partir de Python 3.0, utilisez plutôt sys.maxsize.

Entiers

  • PEP 237 : Essentiellement, long renommé en int. C'est à dire, il n'y a qu'un seul type intégral intégré, nommé int; mais il se comporte principalement comme l'ancien type long.

...

  • La constante sys.maxint a été supprimée, car il n'y a plus de limite à la valeur des entiers. Cependant, sys.maxsize peut être utilisé comme un entier plus grand que n'importe quel index pratique de liste ou de chaîne. Il correspond à la taille entière "naturelle" de l'implémentation et est généralement la même que sys.maxint dans les versions précédentes sur la même plateforme (en supposant les mêmes options de compilation).

3 votes

Correct. En effet, à partir de help(sys) : maxsize -- la longueur maximale supportée des conteneurs. Cela devrait être la réponse acceptée.

0 votes

Je suppose que la réponse correcte dépend du cas d'utilisation : dans mon casa (une valeur par défaut pour un paramètre limitant dans une fonction) c'était en effet la meilleure réponse, YMMV.

123voto

netskink Points 81

Pour Python 3, il n'y a pas de valeur maximale ou minimale pour le type int.

Vous pourriez être intéressé par sys.maxsize à la place. Selon la documentation :

sys.maxsize

Un entier donnant la valeur maximale qu'une variable de type Py_ssize_t peut prendre. C'est généralement 2**31 - 1 sur une plate-forme 32 bits et 2**63 - 1 sur une plate-forme 64 bits.

import sys
max_size = sys.maxsize
min_size = -sys.maxsize - 1

92voto

John Kugelman Points 108754

En Python 2, les entiers passeront automatiquement d'une représentation int de taille fixe à une représentation à largeur variable long une fois que vous atteindrez la valeur sys.maxint, qui est soit 231 - 1 soit 263 - 1 selon votre plateforme. Remarquez le L qui est ajouté ici:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

D'après le manuel de Python 2.7:

Les nombres sont créés par des littéraux numériques ou en tant que résultat de fonctions et opérateurs intégrés. Les littéraux d'entiers sans décoration (y compris les nombres binaires, hexadécimaux et octaux) donnent des entiers simples à moins que la valeur qu'ils représentent soit trop grande pour être représentée comme un entier simple, auquel cas ils donnent un entier long. Les littéraux d'entiers avec un suffixe 'L' ou 'l' donnent des entiers longs ('L' est préféré car 1l ressemble trop à onze!).

Python essaie très fort de faire croire que ses entiers sont des entiers mathématiques et sont non bornés. Il peut par exemple calculer un googol avec facilité:

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

45 votes

Pour ajouter à la confusion, le long de Python n'est pas comme le long de Java - il est plutôt plus proche du BigInteger.

3 votes

En python3, il semble qu'il n'y ait pas de suffixe L, et c'est juste int, pas long,peu importe la taille du nombre.

0 votes

Puis-je suggérer de modifier votre réponse en montrant type(...) au lieu de vous fier à un L à la fin qui peut avoir un sens ambigu ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X