Maksymalne i minimalne wartości dla int

744

Szukam minimalnych i maksymalnych wartości liczb całkowitych w pythonie. Na przykład w Javie mamy Integer.MIN_VALUEi Integer.MAX_VALUE. Czy jest coś takiego w Pythonie?

bdhar
źródło
14
Zauważ, że w Pythonie 3 inttyp jest w zasadzie taki sam jak longw Pythonie 2, więc idea maksimum lub minimum intznika całkowicie. Jest to w zasadzie nieistotne nawet w Pythonie 2.
agf
8
@agf: może być odpowiedni na różne sposoby. Na przykład w dowolnym algorytmie, który wymaga zapisania znalezionej wartości minimalnej (np. Algorytm sortowania). Wartość minimalną można zainicjować na sys.maxint, aby zagwarantować, że każda znaleziona pierwsza wartość zostanie przyjęta jako min
Basile Perrenoud
@Toaster z wyjątkiem tego, że możesz mieć listę, na której wszystkie wartości są większe niż, sys.maxintponieważ jest to maksimum dla inttypu w Pythonie 2, do którego Python po cichu promuje long.
agf
29
Jeśli potrzebujesz użyć w algorytmie „bardzo dużej wartości”, np. Znajdowanie minimalnego lub maksymalnego zbioru ogólnego, float('inf')lub float('-inf')może to być bardzo pomocne.
geoff,
1
Możliwy duplikat zakresów liczb całkowitych Pythona
Waldir Leoncio

Odpowiedzi:

852

Python 3

W Pythonie 3 to pytanie nie ma zastosowania. Typ zwykły intjest nieograniczony.

Być może jednak szukasz informacji o rozmiarze słowa bieżącego tłumacza , który w większości przypadków będzie taki sam jak rozmiar słowa maszyny. Ta informacja jest nadal dostępna w Pythonie 3 as sys.maxsize, który jest maksymalną wartością reprezentowaną przez podpisane słowo. Odpowiednio jest to rozmiar największej możliwej sekwencji lub sekwencji w pamięci .

Zasadniczo maksymalna wartość reprezentowana przez niepodpisane słowo będzie sys.maxsize * 2 + 1, a liczba bitów w słowie będzie math.log2(sys.maxsize * 2 + 2). Zobacz tę odpowiedź, aby uzyskać więcej informacji.

Python 2

W Pythonie 2 maksymalna wartość zwykłych intwartości jest dostępna jako sys.maxint:

>>> sys.maxint
9223372036854775807

Możesz obliczyć minimalną wartość za pomocą, -sys.maxint - 1jak pokazano tutaj .

Po przekroczeniu tej wartości Python płynnie przełącza się ze zwykłych na długie liczby całkowite. Więc przez większość czasu nie będziesz musiał tego wiedzieć.

senderle
źródło
177
Ta liczba może wydawać się dowolna, ale tak nie jest. 9223372036854775807 jest dokładnie 2^63 - 1, więc masz 64-bitową int. Ogólnie rzecz biorąc, n-bitowa liczba całkowita ma wartości od -2^(n-1)do 2^(n-1) - 1.
NullUserException
22
Zauważ, że jeśli używasz 32-bitowego środowiska wykonawczego Python, sys.maxint zwróci 2^31 - 1, nawet jeśli Python przejdzie do 64-bitowego bezproblemowo z longtypem danych.
Scott Stafford
19
Użyj sys.maxsizezamiast tego, zgodnie z sugestią @Akash Rana. Jest obecny także w Pythonie 2, jaksys mówią doktorzy . Dzięki temu kod będzie bardziej kompatybilny z obiema wersjami Pythona.
Ioannis Filippidis
6
Ty i ja mamy różne interpretacje tej linii niż dokumenty. Zamiennik w 2to3to szybka i brudna heurystyka, która przez większość czasu niczego nie zepsuje - ale różnica między tymi dwiema wartościami ma znaczenie. Najlepszą praktyką jest wykorzystanie wartości, którą faktycznie chcesz zastosować. Jeśli naprawdę potrzebujesz sys.maxint w Pythonie 2, nie będziesz go już potrzebować w Pythonie 3, i naprawdę powinien zostać całkowicie usunięty, a nie zmieniony na sys.maxsize.
senderle
3
minsize - Mnożenie przez Bitowy operator min daje minsize ~ sys.maxsize
om471987
238

Jeśli potrzebujesz tylko numeru większego niż wszystkie inne, możesz użyć

float('inf')

w podobny sposób liczba mniejsza niż wszystkie inne:

float('-inf')

Działa to zarówno w Pythonie 2, jak i 3.

Melle
źródło
9
Tylko uwaga, że ​​(jakkolwiek nie ma to znaczenia, ale nadal): float („inf”)> float („inf”) powoduje „false”. Nieskończona liczba powinna być większa niż inna nieskończona liczba :-D ... zaskoczy umysł
Scre
11
@ Scre Czego jeszcze byś się spodziewał? x > xjest zwykle Falsei nieskończoność nie powinna być wyjątkiem. ( float('NaN)z drugiej strony ...)
jamesdlin
6
W rzeczywistości nie dotyczy to intprzyczyny cannot convert infinite float to int... ale działa w większości przypadków
Leighton
5
Pamiętaj, że int('inf')to nie działa.
Tom Hale
3
To nie jest odpowiedź na pytanie OP
ghosh
225

sys.maxintStała została usunięta z Pythonem 3.0 naprzód, zamiast używać sys.maxsize.

Liczby całkowite

  • PEP 237: Zasadniczo długo przemianowano na int. Oznacza to, że istnieje tylko jeden wbudowany typ całkowy o nazwie int; ale zachowuje się głównie jak stary długi typ.
  • PEP 238: Wyrażenie takie jak 1/2 zwraca liczbę zmiennoprzecinkową. Użyj 1 // 2, aby uzyskać obcinanie. (Ta ostatnia składnia istnieje od lat, przynajmniej od Python 2.2.)
  • Stała sys.maxint została usunięta, ponieważ nie ma już limitu wartości całkowitych. Jednak sys.maxsize może być użyty jako liczba całkowita większa niż jakakolwiek praktyczna lista lub indeks łańcuchowy. Jest on zgodny z „naturalną” wielkością całkowitą implementacji i zazwyczaj jest taki sam jak sys.maxint we wcześniejszych wersjach na tej samej platformie (przy założeniu tych samych opcji kompilacji).
  • Reppr () długiej liczby całkowitej nie zawiera już końcowego L, więc kod, który bezwarunkowo usuwa ten znak, odetnie ostatnią cyfrę. (Zamiast tego użyj str ().)
  • Literały ósemkowe nie mają już formy 0720; zamiast tego użyj 0o720.

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

Akash Rana
źródło
1
Poprawny. Rzeczywiście, od help(sys): maxsize - największa obsługiwana długość pojemników . To powinna być zaakceptowana odpowiedź.
Marco Sulla,
77

W Pythonie liczby całkowite automatycznie przełączają się z reprezentacji o stałym rozmiarze na intreprezentację o zmiennej szerokości longpo przekazaniu wartości sys.maxint, która w zależności od platformy wynosi 2 31–1 lub 2 63–1 . Zauważ, Lże dołącza się tutaj:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Z podręcznika Python :

Liczby są tworzone za pomocą literałów numerycznych lub w wyniku wbudowanych funkcji i operatorów. Niezdobione literały całkowite (w tym liczby binarne, szesnastkowe i ósemkowe) dają zwykłe liczby całkowite, chyba że wartość, którą oznaczają, jest zbyt duża, aby można ją było przedstawić jako zwykłą liczbę całkowitą, w którym to przypadku dają długą liczbę całkowitą. Literały całkowite z przyrostkiem 'L'lub 'l'przyrostkiem dają długie liczby całkowite ( 'L'jest to preferowane, ponieważ 1lwygląda na zbyt jedenaście!).

Python bardzo stara się udawać, że jego liczby całkowite są liczbami matematycznymi i są nieograniczone. Może na przykład z łatwością obliczyć googol :

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
John Kugelman
źródło
36
Aby dodać zamieszanie, Python longnie jest podobny do Javy long- jest raczej bliżej BigInteger.
NullUserException
Wydaje się, że w python3 nie ma Lsufiksu i po prostu intnie longma znaczenia, jak duża jest ta liczba.
Eric Wang
39

Tak jest w przypadku Python 3

import sys
max = sys.maxsize
min = -sys.maxsize - 1
netskink
źródło
3
python 3 nie istnieje. patrz stackoverflow.com/questions/13795758/…
netskink
34
cóż, python 3 istnieje , na szczęście (!); ale sys.maxintnie istnieje w Pythonie 3 (tl; dr: " sys.maxintstała została usunięta (w python3), ponieważ nie ma już ograniczenia wartości liczb całkowitych. Jednak sys.maxsizemoże być używana jako liczba całkowita większa niż jakakolwiek praktyczna lista lub ciąg znaków index. " )
Michael
2
Po co tworzyć zmienne, które wbudowują cień, takie jak min()i max()?
RoadRunner - MSFT
1
Spójrz na komplement binarny 2
netskink
2
min = ~sys.maxsize
Andrew,
10

Możesz użyć „inf” w następujący sposób:

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

Patrz: matematyka - funkcje matematyczne

Rahul Nimbal
źródło
1
Zauważ, że math.infjest to odpowiednikfloat('inf')
Georgy,
5

Jeśli chcesz uzyskać maksimum dla indeksów tablic lub list (równoważne z size_tC / C ++), możesz użyć numpy:

np.iinfo(np.intp).max

Jest to takie samo, ponieważ sys.maxsizezaletą jest to, że nie potrzebujesz do tego tylko systemu importu.

Jeśli chcesz max dla natywnej int na komputerze:

np.iinfo(np.intc).max

Możesz zobaczyć inne dostępne typy w dokumencie .

Do pływaków można również użyć sys.float_info.max.

Shital Shah
źródło
2

W dużym stopniu polegam na takich poleceniach.

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

Max int zwrócone: 9223372036854775807

Aby uzyskać więcej odniesień do „sys”, powinieneś uzyskać dostęp

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

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

Wender
źródło
1
No - maxsize to po prostu największy możliwy indeks kontenera. Python z przyjemnością będzie obsługiwał liczby całkowite 100 i więcej
Tony Suffolk 66,