Jak mogę reprezentować nieskończoną liczbę w Pythonie?
558
Jak mogę reprezentować nieskończoną liczbę w pythonie? Bez względu na to, jaką liczbę wprowadzisz do programu, żadna liczba nie powinna być większa niż ta reprezentacja nieskończoności.
math.infjest przydatny jako wartość początkowa w problemach optymalizacyjnych, ponieważ działa poprawnie z min, np. min(5, math.inf) == 5. Na przykład w algorytmach najkrótszej ścieżki można ustawić nieznane odległości math.infbez potrzeby specjalnego przypadku Nonelub zakładania górnej granicy 9999999. Podobnie można użyć -math.infjako wartości początkowej dla problemów z maksymalizacją.
Pułkownik Panic
W większości przypadków alternatywą do używania math.inf w problemach związanych z optymalizacją jest rozpoczęcie od pierwszej wartości.
Tobias Bergkvist
Odpowiedzi:
706
W Pythonie możesz:
test = float("inf")
W Python 3.5 możesz:
import math
test = math.inf
I wtedy:
test >1
test >10000
test > x
Zawsze będzie prawdą. O ile oczywiście, jak wskazano, x jest również nieskończonością lub „nan” („nie liczbą”).
Dodatkowo (TYLKO Python 2.x), w porównaniu do Ellipsis, float(inf)jest mniejszy, np .:
Zauważ, że nieskończoność jest zdefiniowana w normie IEEE 754-1985 ( en.wikipedia.org/wiki/IEEE_754-1985 ), na której będzie polegał każdy współczesny język. Inną kwestią jest to, że zgodnie z tą normą nieskończoność musi (oczywiście) być liczbą zmiennoprzecinkową. To może wyjaśniać, dlaczego Python wybrał tę akward składnię.
Quickbug
3
Nie będzie to również prawdą, jeśli x jest wbudowany Ellipsis, który porównuje większy niż wszystko, w tym nieskończoność. float("inf") < Ellipsiszwraca True
Singletoned
2
Nie jestem pewien co do ostatniego, math.inf < ...lub float('inf') > Ellipsisrzuca TypeError: unorderable types: float() < ellipsis(), przynajmniej dla mnie.
dlaczego nie dodasz, dlaczego jest to mniej wygodne i dlaczego ktoś powinien go używać ?
Niccolò,
4
Zobaczmy: Decimal('Infinity') == float('inf')zwraca True, więc jest prawie tak samo.
Denis Malinovsky
8
@afzal_SH również float('inf') is float('inf')zwracaFalse
nemesisdesign
4
nieskończoność różni się nawet od siebie, więc twój komentarz nie miał dla mnie większego sensu, IMHO
nemesisdesign
5
float('inf') is float('inf')-> False, po prostu stwierdził, że są to różne przedmioty o różnych przypadkach, ale nie, że zawartość wewnętrzne są różne - faktycznie jak @nemesisdesign spiczasty float('int') == float('int')trzyma się True. Jest to ten sam problem, co porównywanie obiektów zmiennych, takich jak [1,2,3], to [1,2,3] i [1,2,3] == [1,2,3], które są, w kolejności, fałszywe i True .. Więcej informacji: stackoverflow.com/questions/2988017/…
Manoel Vilela
13
W python2.x był brudny hack, który służył temu celowi (NIGDY nie używaj go, chyba że jest to absolutnie konieczne):
None< any integer < any string
Zatem kontrola i < ''trzyma Truedla dowolnej liczby całkowitej i.
Został dość przestarzały w Python3. Teraz takie porównania kończą się
math.inf
jest przydatny jako wartość początkowa w problemach optymalizacyjnych, ponieważ działa poprawnie z min, np.min(5, math.inf) == 5
. Na przykład w algorytmach najkrótszej ścieżki można ustawić nieznane odległościmath.inf
bez potrzeby specjalnego przypadkuNone
lub zakładania górnej granicy9999999
. Podobnie można użyć-math.inf
jako wartości początkowej dla problemów z maksymalizacją.Odpowiedzi:
W Pythonie możesz:
W Python 3.5 możesz:
I wtedy:
Zawsze będzie prawdą. O ile oczywiście, jak wskazano, x jest również nieskończonością lub „nan” („nie liczbą”).
Dodatkowo (TYLKO Python 2.x), w porównaniu do
Ellipsis
,float(inf)
jest mniejszy, np .:zwróci prawdę.
źródło
Ellipsis
, który porównuje większy niż wszystko, w tym nieskończoność.float("inf") < Ellipsis
zwraca Truemath.inf < ...
lubfloat('inf') > Ellipsis
rzucaTypeError: unorderable types: float() < ellipsis()
, przynajmniej dla mnie.Od wersji Python 3.5 możesz używać
math.inf
:źródło
Wydaje się, że nikt nie wspomniał wprost o nieskończoności negatywnej, więc myślę, że powinienem ją dodać.
Dla pozytywnej nieskończoności (tylko ze względu na kompletność):
W przypadku ujemnej nieskończoności:
źródło
Nie wiem dokładnie, co robisz, ale
float("inf")
daje ci zmienną nieskończoność, która jest większa niż jakakolwiek inna liczba.źródło
Istnieje nieskończona w bibliotece NumPy:
from numpy import inf
. Aby uzyskać ujemną nieskończoność, wystarczy napisać-inf
.źródło
Innym, mniej wygodnym sposobem na to jest użycie
Decimal
klasy:źródło
Decimal('Infinity') == float('inf')
zwracaTrue
, więc jest prawie tak samo.float('inf') is float('inf')
zwracaFalse
float('inf') is float('inf')
->False
, po prostu stwierdził, że są to różne przedmioty o różnych przypadkach, ale nie, że zawartość wewnętrzne są różne - faktycznie jak @nemesisdesign spiczastyfloat('int') == float('int')
trzyma sięTrue
. Jest to ten sam problem, co porównywanie obiektów zmiennych, takich jak [1,2,3], to [1,2,3] i [1,2,3] == [1,2,3], które są, w kolejności, fałszywe i True .. Więcej informacji: stackoverflow.com/questions/2988017/…W python2.x był brudny hack, który służył temu celowi (NIGDY nie używaj go, chyba że jest to absolutnie konieczne):
Zatem kontrola
i < ''
trzymaTrue
dla dowolnej liczby całkowiteji
.Został dość przestarzały w Python3. Teraz takie porównania kończą się
źródło
MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Również jeśli używasz SymPy, możesz użyć
sympy.oo
itp.
źródło