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.

ssierral
źródło
29
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 .:

float('inf') < Ellipsis

zwróci prawdę.

WilHall
źródło
15
A jeśli x jest również inf, to nie będzie prawdą.
Maxim Egorushkin
5
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.
Peter Goldsborough,
2
Jestem na 3.5. Prawdopodobnie rzecz 2.x / 3.x.
Peter Goldsborough,
80

Od wersji Python 3.5 możesz używać math.inf:

>>> import math
>>> math.inf
inf
po prawej stronie
źródło
47

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ść):

math.inf

W przypadku ujemnej nieskończoności:

-math.inf
Sнаđошƒаӽ
źródło
30

Nie wiem dokładnie, co robisz, ale float("inf")daje ci zmienną nieskończoność, która jest większa niż jakakolwiek inna liczba.

Ned Batchelder
źródło
27

Istnieje nieskończona w bibliotece NumPy: from numpy import inf. Aby uzyskać ujemną nieskończoność, wystarczy napisać -inf.

Lenar Hoyt
źródło
24

Innym, mniej wygodnym sposobem na to jest użycie Decimalklasy:

from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')
Denis Malinowski
źródło
21
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ę

TypeError: unorderable types: str() < int()
Antony Hatchkins
źródło
5
Jeśli naprawdę tego używasz, przynajmniej zawiń w kilka czytelnych nazw, takich jak:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Ali Rasim Kocal
5
Ale nie musisz tego używać.
Joost
3

Również jeśli używasz SymPy, możesz użyć sympy.oo

>>> from sympy import oo
>>> oo + 1
oo
>>> oo - oo
nan

itp.

Victor VosMottor dziękuje Monice
źródło