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?

bdhar
la source
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.

senderle
la source
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.

Melle
la source
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

Akash Rana
la source
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
John Kugelman
la source
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
netskink
la source
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
10

Vous pouvez utiliser 'inf' comme ceci:

import math
bool_true = 0 < math.inf
bool_false = 0 < -math.inf

Refer: math - Fonctions mathématiques

Rahul Nimbal
la source
1
Notez que cela math.inféquivaut àfloat('inf')
Georgy
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.

Shital Shah
la source
2

Je compte beaucoup sur des commandes comme celle-ci.

python -c 'import sys; print(sys.maxsize)'

Int max renvoyé: 9223372036854775807

Pour plus de références pour 'sys', vous devriez accéder

https://docs.python.org/3/library/sys.html

https://docs.python.org/3/library/sys.html#sys.maxsize

Wender
la source
1
No - maxsize est simplement le plus grand index de conteneur possible. Python fonctionnera avec plaisir avec des nombres entiers à 100 chiffres et plus
Tony Suffolk 66