Come posso rappresentare un numero infinito in Python?


560

Come posso rappresentare un numero infinito in Python? Indipendentemente dal numero inserito nel programma, nessun numero dovrebbe essere maggiore di questa rappresentazione dell'infinito.


29
math.infè utile come valore iniziale nei problemi di ottimizzazione, perché funziona correttamente con min, ad es. min(5, math.inf) == 5. Ad esempio, negli algoritmi del percorso più breve, è possibile impostare distanze sconosciute su math.infsenza la necessità di un caso speciale Noneo assumere un limite superiore 9999999. Allo stesso modo, è possibile utilizzare -math.infcome valore iniziale per problemi di massimizzazione.
Colonnello Panic,

Nella maggior parte dei casi, un'alternativa all'utilizzo di math.inf nei problemi di ottimizzazione è iniziare con il primo valore.
Tobias Bergkvist,

Risposte:


708

In Python puoi fare:

test = float("inf")

In Python 3.5, puoi fare:

import math
test = math.inf

E poi:

test > 1
test > 10000
test > x

Sarà sempre vero. A meno che, naturalmente, come sottolineato, x sia anche infinito o "nan" ("non un numero").

Inoltre (SOLO Python 2.x), in confronto a Ellipsis, float(inf)è minore, ad esempio:

float('inf') < Ellipsis

ritornerebbe vero.


15
E se x è anche inf, ciò non sarà vero.
Maxim Egorushkin,

5
Si noti che l'infinito è definito nella norma IEEE 754-1985 ( en.wikipedia.org/wiki/IEEE_754-1985 ), su cui farà affidamento qualsiasi linguaggio moderno. Un altro punto è che, secondo questa norma, l'infinito deve (ovviamente) essere un numero in virgola mobile. Questo potrebbe spiegare perché Python abbia scelto questa sintassi akward.
quickbug

3
Inoltre, non sarà vero se x è l'integrato Ellipsis, che è più grande di tutto, compreso l'infinito. float("inf") < Ellipsisrestituisce True
Singletoned il

2
Non sono sicuro dell'ultimo, math.inf < ...o float('inf') > Ellipsislancia un TypeError: unorderable types: float() < ellipsis(), almeno per me.
Peter Goldsborough,

2
Sono al 3.5. Probabilmente una cosa 2.x / 3.x.
Peter Goldsborough,

80

Da Python 3.5 puoi usare math.inf:

>>> import math
>>> math.inf
inf

47

Nessuno sembra aver parlato esplicitamente dell'infinito negativo, quindi penso che dovrei aggiungerlo.

Per l'infinito positivo (solo per completezza):

math.inf

Per infinito negativo:

-math.inf

30

Non so esattamente cosa stai facendo, ma float("inf")ti dà un float Infinity, che è maggiore di qualsiasi altro numero.


27

C'è un infinito nella biblioteca NumPy: from numpy import inf. Per ottenere l'infinito negativo si può semplicemente scrivere -inf.


24

Un altro modo meno conveniente per farlo è usare la Decimalclasse:

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

21
perché non aggiungi perché è meno conveniente e perché qualcuno dovrebbe usarlo ?
Niccolò,

4
Vediamo: Decimal('Infinity') == float('inf')ritorna True, quindi è praticamente lo stesso.
Denis Malinovsky,

8
@afzal_SH float('inf') is float('inf')rendimenti Falsetroppo
nemesisdesign

4
l'infinito è diverso anche da se stesso, quindi il tuo commento non ha molto senso per me, IMHO
nemesisdesign

5
float('inf') is float('inf')-> False, solo sostiene che si tratta di oggetti diversi con diverse istanze, ma non che i contenuti interni sono diversi - in realtà come @nemesisdesign punte float('int') == float('int')tiene a True. Questo è lo stesso problema del confronto di oggetti mutabili come [1,2,3] è [1,2,3] e [1,2,3] == [1,2,3], che sono, nell'ordine, falsi e True .. Altre informazioni: stackoverflow.com/questions/2988017/…
Manoel Vilela,

13

In python2.x c'era un hack sporco che serviva a questo scopo (MAI usarlo se non assolutamente necessario):

None < any integer < any string

Pertanto, il controllo i < ''vale Trueper qualsiasi numero intero i.

È stato ragionevolmente deprecato in python3. Ora tali confronti finiscono con

TypeError: unorderable types: str() < int()

5
Se hai davvero usato questo, almeno MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
avvolgilo

5
Ma non devi usare questo.
Joost,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.