Maximal- und Minimalwerte für Ints

745

Ich suche nach minimalen und maximalen Werten für ganze Zahlen in Python. Zum Beispiel haben wir in Java Integer.MIN_VALUEund Integer.MAX_VALUE. Gibt es so etwas in Python?

bdhar
quelle
14
Beachten Sie, dass der intTyp in Python 3 im Grunde der gleiche ist wie der longTyp in Python 2, sodass die Idee eines Maximums oder Minimums intvollständig verschwindet. Es ist im Grunde genommen sogar auf Python 2 irrelevant.
Agf
8
@agf: Es kann auf verschiedene Arten relevant sein. Zum Beispiel in jedem Algorithmus, der den gefundenen Mindestwert speichern muss (wie bei einem Sortieralgorithmus). Der min-Wert könnte bei sys.maxint initialisiert werden, um sicherzustellen, dass jeder zuerst gefundene Wert als min angenommen wird
Basile Perrenoud
@Toaster, außer dass Sie eine Liste haben können, in der alle Werte größer sind als, sys.maxintda dies nur das Maximum für den intTyp in Python 2 ist, den Python stillschweigend auf a hochstuft long.
Agf
30
Wenn Sie in einem Algorithmus "einen sehr großen Wert" verwenden müssen, z. B. das Finden eines Minimums oder Maximums einer generischen Sammlung, float('inf')oder float('-inf')wenn dies sehr hilfreich sein kann.
Geoff
1
Mögliches Duplikat von Python-Ganzzahlbereichen
Waldir Leoncio

Antworten:

853

Python 3

In Python 3 trifft diese Frage nicht zu. Der einfache intTyp ist unbegrenzt.

Möglicherweise suchen Sie jedoch tatsächlich nach Informationen zur Wortgröße des aktuellen Interpreters , die in den meisten Fällen der Wortgröße des Geräts entspricht. Diese Informationen sind in Python 3 weiterhin verfügbar. Dies sys.maxsizeist der Maximalwert, der durch ein vorzeichenbehaftetes Wort dargestellt werden kann. Entsprechend ist es die Größe der größtmöglichen Liste oder In-Memory- Sequenz .

Im Allgemeinen ist der durch ein vorzeichenloses Wort darstellbare Maximalwert sys.maxsize * 2 + 1und die Anzahl der Bits in einem Wort math.log2(sys.maxsize * 2 + 2). Weitere Informationen finden Sie in dieser Antwort .

Python 2

In Python 2 ist der Maximalwert für einfache intWerte verfügbar als sys.maxint:

>>> sys.maxint
9223372036854775807

Sie können den Mindestwert mit -sys.maxint - 1wie hier gezeigt berechnen .

Python wechselt nahtlos von einfachen zu langen Ganzzahlen, sobald Sie diesen Wert überschreiten. Die meiste Zeit müssen Sie es also nicht wissen.

senderle
quelle
177
Diese Zahl mag willkürlich erscheinen, ist es aber nicht. 9223372036854775807 ist genau 2^63 - 1, Sie haben also einen 64-Bit-Int. Im Allgemeinen hat eine n-Bit-Ganzzahl Werte im Bereich von -2^(n-1)bis 2^(n-1) - 1.
NullUserException
22
Beachten Sie, dass sys.maxint bei Verwendung einer 32-Bit-Python-Laufzeit zurückgegeben wird 2^31 - 1, obwohl Python nahtlos mit dem longDatentyp auf 64-Bit springt .
Scott Stafford
19
Verwenden Sie sys.maxsizestattdessen, wie von @Akash Rana vorgeschlagen. Es ist auch in Python 2 vorhanden, wie in den sysDokumenten angegeben . Dadurch wird der Code mit beiden Python-Versionen kompatibler.
Ioannis Filippidis
6
Sie und ich haben andere Interpretationen dieser Zeile als die Dokumente. Der Ersatz in 2to3ist eine feine, schnelle und schmutzige Heuristik, die die meiste Zeit nichts kaputt macht - aber der Unterschied zwischen diesen beiden Werten ist wichtig. Die beste Vorgehensweise besteht darin, den Wert zu verwenden, den Sie tatsächlich verwenden möchten. Wenn Sie es sys.maxint in Python 2 wirklich brauchen , brauchen Sie es in Python 3 nicht mehr und es sollte wirklich vollständig entfernt und nicht geändert werden sys.maxsize.
Absender
3
minsize - Multiplizieren mit Bitwise min Operator ergibt minsize ~ sys.maxsize
om471987
238

Wenn Sie nur eine Nummer benötigen, die größer als alle anderen ist, können Sie verwenden

float('inf')

in ähnlicher Weise eine Zahl kleiner als alle anderen:

float('-inf')

Dies funktioniert sowohl in Python 2 als auch in Python 3.

Melle
quelle
9
Nur eine Anmerkung (wie irrelevant es ist, aber immer noch): float ('inf')> float ('inf') führt zu 'false'. Die unendliche Zahl sollte größer sein als eine andere unendliche Zahl :-D ... Mind Snaps
Scre
11
@ Scre Was würden Sie sonst noch erwarten? x > xist in der Regel Falseund Unendlichkeit sollte keine Ausnahme sein. ( float('NaN), auf der anderen Seite ...)
Jamesdlin
6
Dies gilt eigentlich nicht für intCauze cannot convert infinite float to int... aber funktioniert in den meisten Fällen
Leighton
5
Beachten Sie, dass int('inf')dies nicht funktioniert.
Tom Hale
4
Dies ist keine Antwort auf die OP-Frage
Ghosh
225

Die sys.maxintKonstante wurde ab Python 3.0 entfernt, stattdessen verwenden sys.maxsize.

Ganzzahlen

  • PEP 237: Im Wesentlichen lange in int umbenannt. Das heißt, es gibt nur einen integrierten Integraltyp mit dem Namen int. aber es verhält sich meistens wie der alte lange Typ.
  • PEP 238: Ein Ausdruck wie 1/2 gibt einen Float zurück. Verwenden Sie 1 // 2, um das Abschneideverhalten zu erhalten. (Die letztere Syntax existiert seit Jahren, zumindest seit Python 2.2.)
  • Die Konstante sys.maxint wurde entfernt, da der Wert von Ganzzahlen nicht mehr begrenzt ist. Sys.maxsize kann jedoch als Ganzzahl verwendet werden, die größer ist als jede praktische Liste oder jeder Zeichenfolgenindex. Es entspricht der „natürlichen“ Ganzzahlgröße der Implementierung und entspricht normalerweise sys.maxint in früheren Versionen auf derselben Plattform (unter der Annahme derselben Erstellungsoptionen).
  • Das repr () einer langen Ganzzahl enthält kein nachfolgendes L mehr. Code, der dieses Zeichen bedingungslos entfernt, schneidet stattdessen die letzte Ziffer ab. (Verwenden Sie stattdessen str ().)
  • Oktalliterale haben nicht mehr die Form 0720; Verwenden Sie stattdessen 0o720.

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

Akash Rana
quelle
1
Richtig. In der Tat von help(sys): maxsize - der größten unterstützten Länge von Containern . Dies sollte die akzeptierte Antwort sein.
Marco Sulla
77

In Python wechseln Ganzzahlen automatisch von einer intDarstellung mit fester Größe in eine Darstellung mit variabler Breite long, sobald Sie den Wert übergeben sys.maxint, der je nach Plattform entweder 2 31 - 1 oder 2 63 - 1 beträgt . Beachten Sie das L, was hier angehängt wird:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Aus dem Python-Handbuch :

Zahlen werden durch numerische Literale oder als Ergebnis integrierter Funktionen und Operatoren erstellt. Ungeschmückte Ganzzahlliterale (einschließlich Binär-, Hex- und Oktalzahlen) ergeben einfache Ganzzahlen, es sei denn, der von ihnen angegebene Wert ist zu groß, um als einfache Ganzzahl dargestellt zu werden. In diesem Fall ergeben sie eine lange Ganzzahl. Ganzzahlige Literale mit einem 'L'oder einem 'l'Suffix ergeben lange Ganzzahlen ( 'L'wird bevorzugt, weil sie 1lzu elf aussehen!).

Python ist sehr bemüht, so zu tun, als wären seine ganzen Zahlen mathematische ganze Zahlen und unbegrenzt. Es kann zum Beispiel ein Googol mit Leichtigkeit berechnen :

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
John Kugelman
quelle
36
Um die Verwirrung zu vergrößern, ist Pythons longnicht wie Javas long- es ist eher näher an BigInteger.
NullUserException
In Python3 scheint es kein LSuffix zu geben, und es ist einfach intnicht long, egal wie groß die Zahl ist.
Eric Wang
39

Für Python 3 ist es

import sys
max = sys.maxsize
min = -sys.maxsize - 1
Netskink
quelle
3
Python 3 existiert nicht. siehe stackoverflow.com/questions/13795758/…
netskink
34
Nun, Python 3 existiert zum Glück (!); aber ist sys.maxintnicht vorhanden in Python 3 (tl; dr: " sys.maxintkonstant entfernt wurde (in python3), da es nicht länger eine Grenze für den Wert der ganzen Zahlen jedoch. sys.maxsizekann als eine ganze Zahl verwendet werden , die größer als eine praktische Liste oder eine Zeichenfolge index. " )
michael
2
Warum Variablen erstellen, die eingebaute Schatten wie min()und enthalten max()?
RoadRunner - MSFT
1
Schauen Sie nach 2 Kompliment binär
Netskink
2
min = ~sys.maxsize
Andrew
10

Sie können 'inf' wie folgt verwenden:

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

Siehe: Mathematik - Mathematische Funktionen

Rahul Nimbal
quelle
1
Beachten Sie, dass dies math.infentsprichtfloat('inf')
Georgy
5

Wenn Sie das Maximum für Array- oder size_tListenindizes möchten (entspricht C / C ++), können Sie numpy verwenden:

np.iinfo(np.intp).max

Dies ist derselbe wie der sys.maxsizeVorteil, dass Sie kein Importsystem nur dafür benötigen.

Wenn Sie max für native int auf dem Computer möchten:

np.iinfo(np.intc).max

Sie können sich andere verfügbare Typen in doc ansehen .

Für Schwimmer können Sie auch verwenden sys.float_info.max.

Shital Shah
quelle
2

Ich verlasse mich stark auf solche Befehle.

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

Max int zurückgegeben: 9223372036854775807

Für weitere Referenzen für 'sys' sollten Sie zugreifen

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

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

Wender
quelle
1
No - maxsize ist einfach der größtmögliche Containerindex. Python wird glücklich mit 100-stelligen ganzen Zahlen und mehr arbeiten
Tony Suffolk 66