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.


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ę.


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,


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

30

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


27

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


24

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

from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')

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()

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.