Valeurs maximale et minimale pour les pouces


747

Je recherche des valeurs minimales et maximales pour les entiers en python. Par exemple, en Java, nous avons Integer.MIN_VALUEet Integer.MAX_VALUE. Y a-t-il quelque chose comme ça en python?


14
Notez que dans Python 3, le inttype est fondamentalement le même que le longtype dans Python 2, donc l'idée d'un maximum ou d'un minimum intdisparaît complètement. C'est fondamentalement hors de propos même sur Python 2.
agf

8
@agf: il peut être pertinent de différentes manières. Par exemple, dans tout algorithme qui nécessite de sauvegarder la valeur min trouvée (comme un algorithme de tri). La valeur min peut être initialisée à sys.maxint afin de garantir que toute première valeur trouvée est prise en min
Basile Perrenoud

@Toaster sauf que vous pouvez avoir une liste où toutes les valeurs sont supérieures sys.maxintcar ce n'est que le maximum pour le inttype sur Python 2, que Python promouvra silencieusement en a long.
agf

30
Si vous devez utiliser "une très grande valeur" dans un algorithme, par exemple trouver le minimum ou le maximum d'une collection générique, float('inf')ou float('-inf')peut être très utile.
geoff

1
Duplicata possible des plages d'entiers Python
Waldir Leoncio

Réponses:


854

Python 3

En Python 3, cette question ne s'applique pas. Le inttype simple est illimité.

Cependant, vous pourriez en fait rechercher des informations sur la taille de mot de l'interpréteur actuel , qui sera la même que la taille de mot de la machine dans la plupart des cas. Ces informations sont toujours disponibles dans Python 3 as sys.maxsize, qui est la valeur maximale représentable par un mot signé. De manière équivalente, c'est la taille de la plus grande liste possible ou séquence en mémoire .

Généralement, 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 intvaleurs simples est disponible sous la forme sys.maxint:

>>> sys.maxint
9223372036854775807

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

Python passe de manière transparente de simples entiers longs à une fois que vous dépassez cette valeur. La plupart du temps, vous n'aurez donc pas besoin de le savoir.


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

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

19
Utilisez sys.maxsizeplutôt, comme suggéré par @Akash Rana. Il est également présent dans Python 2, comme lesys disent les documents . Cela rendra le code plus compatible avec les deux versions de Python.
Ioannis Filippidis

6
Vous et moi avons des interprétations différentes de cette ligne des documents. Le remplacement 2to3est une fine heuristique rapide et sale qui ne cassera rien la plupart du temps - mais la différence entre ces deux valeurs est importante. La meilleure pratique consiste à utiliser la valeur que vous souhaitez réellement utiliser. Si vous en avez vraiment besoin sys.maxint en Python 2, vous n'en aurez plus besoin en Python 3, et il devrait vraiment être entièrement supprimé, pas changé en sys.maxsize.
senderle

3
minsize - La multiplication avec l'opérateur min au niveau du bit donne minsize ~ sys.maxsize
om471987

240

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

float('inf')

de façon similaire, un nombre plus petit que tous les autres:

float('-inf')

Cela fonctionne à la fois en python 2 et 3.


9
Juste une note (comme non pertinente, mais quand même): float ('inf')> float ('inf') donne 'false'. Le nombre infini devrait être plus grand qu'un autre nombre infini :-D ... snaps d'esprit
Scre

11
@Scre À quoi d'autre vous attendriez-vous? x > xest généralement False, et l'infini ne devrait pas faire exception. ( float('NaN), d'autre part ...)
jamesdlin

6
En fait, cela ne s'applique pas à la intgaze cannot convert infinite float to int... mais fonctionne dans la plupart des cas
Leighton

5
Notez que int('inf')cela ne fonctionne pas.
Tom Hale

4
Ce n'est pas une réponse à la question OP
ghosh

225

La sys.maxintconstante a été supprimée de Python 3.0, utilisez plutôt sys.maxsize.

Entiers

  • PEP 237: Essentiellement, renommé depuis longtemps en int. Autrement dit, il n'y a qu'un seul type intégral intégré, nommé int; mais il se comporte principalement comme l'ancien type long.
  • PEP 238: Une expression comme 1/2 renvoie un flottant. Utilisez 1 // 2 pour obtenir le comportement de troncature. (Cette dernière syntaxe existe depuis des années, au moins depuis Python 2.2.)
  • 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 quelle liste pratique ou index de chaîne. Il est conforme à la taille entière «naturelle» de l'implémentation et est généralement le même que sys.maxint dans les versions précédentes sur la même plate-forme (en supposant les mêmes options de construction).
  • Le repr () d'un entier long n'inclut plus le L de fin, donc le code qui supprime inconditionnellement ce caractère coupera le dernier chiffre à la place. (Utilisez plutôt str ().)
  • Les littéraux octaux ne sont plus de la forme 0720; utilisez plutôt 0o720.

Voir: https://docs.python.org/3/whatsnew/3.0.html#integers


1
Correct. En effet, à partir de help(sys): maxsize - la plus grande longueur prise en charge des conteneurs . Ce devrait être la réponse acceptée.
Marco Sulla

77

En Python, les entiers passeront automatiquement d'une intreprésentation de taille fixe à une longreprésentation de largeur variable une fois que vous aurez passé la valeur sys.maxint, qui est soit 2 31 - 1 ou 2 63 - 1 selon votre plateforme. Remarquez ce Lqui est ajouté ici:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Depuis le manuel Python :

Les nombres sont créés par des littéraux numériques ou à la suite de fonctions et d'opérateurs intégrés. Les littéraux entiers non ornés (y compris les nombres binaires, hexadécimaux et octaux) donnent des entiers simples sauf si la valeur qu'ils dénotent est trop grande pour être représentée comme un entier simple, auquel cas ils donnent un entier long. Les littéraux entiers avec un suffixe 'L'ou 'l'produisent des entiers longs ( 'L'est préférable car il 1lressemble trop à onze!).

Python essaie très fort de prétendre que ses entiers sont des entiers mathématiques et sont illimités. Il peut, par exemple, calculer facilement un googol :

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

37
Pour ajouter à la confusion, Python longn'est pas comme Java long- il est plutôt plus proche BigInteger.
NullUserException

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

39

Pour Python 3, c'est

import sys
max = sys.maxsize
min = -sys.maxsize - 1

3
python 3 n'existe pas. voir stackoverflow.com/questions/13795758/…
netskink

34
eh bien, python 3 existe , heureusement (!); mais sys.maxintn'existe pas en python 3 (tl; dr: "la sys.maxintconstante a été supprimée (en python3), car il n'y a plus de limite à la valeur des entiers. Cependant, sys.maxsizepeut être utilisé comme un entier plus grand que n'importe quelle liste ou chaîne pratique index. " )
michael

3
Pourquoi créer des variables qui masquent les fonctions intégrées telles que min()et max()?
RoadRunner - MSFT

1
Cherchez le compliment binaire de 2
netskink

2
min = ~sys.maxsize
Andrew


5

Si vous voulez le maximum pour les index de tableau ou de liste (équivalent à size_tC / C ++), vous pouvez utiliser numpy:

np.iinfo(np.intp).max

C'est la même chose que sys.maxsize mais l'avantage est que vous n'avez pas besoin d'importer sys juste pour cela.

Si vous voulez max pour native int sur la machine:

np.iinfo(np.intc).max

Vous pouvez consulter d'autres types disponibles dans la doc .

Pour les flotteurs, vous pouvez également utiliser sys.float_info.max.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.