¿Cómo puedo representar un número infinito en Python?

560

¿Cómo puedo representar un número infinito en python? No importa qué número ingrese en el programa, ningún número debe ser mayor que esta representación de infinito.

ssierral
fuente
29
math.infes útil como valor inicial en problemas de optimización, porque funciona correctamente con min, por ejemplo. min(5, math.inf) == 5. Por ejemplo, en los algoritmos de ruta más corta, puede establecer distancias desconocidas math.infsin necesidad de utilizar un caso especial Noneo asumir un límite superior 9999999. Del mismo modo, puede usarlo -math.infcomo valor inicial para problemas de maximización.
Coronel Panic
En la mayoría de los casos, una alternativa al uso de math.inf en problemas de optimización es comenzar con el primer valor.
Tobias Bergkvist

Respuestas:

708

En Python, puedes hacer:

test = float("inf")

En Python 3.5, puedes hacer:

import math
test = math.inf

Y entonces:

test > 1
test > 10000
test > x

Siempre sera verdad. A menos, por supuesto, como se señaló, x también es infinito o "nan" ("no es un número").

Además (SOLO Python 2.x), en comparación con Ellipsis, float(inf)es menor, por ejemplo:

float('inf') < Ellipsis

Volvería cierto.

WilHall
fuente
15
Y si x también es inf, eso no será cierto.
Maxim Egorushkin
55
Tenga en cuenta que el infinito se define en la norma IEEE 754-1985 ( en.wikipedia.org/wiki/IEEE_754-1985 ), en la que se basará cualquier lenguaje moderno. Otro punto es que, de acuerdo con esta norma, el infinito debe (obviamente) ser un número de coma flotante. Esto podría explicar por qué Python ha elegido esta sintaxis incómoda.
fastbug
3
Tampoco será cierto si x es el incorporado Ellipsis, que se compara más que todo, incluido el infinito. float("inf") < Ellipsisdevuelve True
Singletoned
2
No estoy seguro sobre el último, math.inf < ...o float('inf') > Ellipsislanza un TypeError: unorderable types: float() < ellipsis(), al menos para mí.
Peter Goldsborough
2
Estoy en 3.5. Probablemente una cosa 2.x / 3.x.
Peter Goldsborough
80

Desde Python 3.5 puedes usar math.inf:

>>> import math
>>> math.inf
inf
pliegue derecho
fuente
47

Nadie parece haber mencionado explícitamente el infinito negativo, por lo que creo que debería agregarlo.

Para el infinito positivo (solo por completar):

math.inf

Para infinito negativo:

-math.inf
Sнаđошƒаӽ
fuente
30

No sé exactamente lo que estás haciendo, pero float("inf")te da un infinito flotante, que es mayor que cualquier otro número.

Ned Batchelder
fuente
27

Existe una infinidad en la biblioteca NumPy: from numpy import inf. Para obtener el infinito negativo, uno simplemente puede escribir -inf.

Lenar Hoyt
fuente
24

Otra forma menos conveniente de hacerlo es usar Decimalclass:

from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')
Denis Malinovsky
fuente
21
¿Por qué no agregas por qué es menos conveniente y por qué alguien debería usarlo ?
Niccolò
44
Veamos: Decimal('Infinity') == float('inf')regresa True, así que es más o menos lo mismo.
Denis Malinovsky el
8
@afzal_SH también float('inf') is float('inf')regresaFalse
nemesisdesign
44
el infinito es diferente incluso de sí mismo, por lo que su comentario no tenía mucho sentido para mí, en mi humilde opinión
nemesisdesign
55
float('inf') is float('inf')-> False, simplemente sostiene que son diferentes objetos con diferentes instancias, pero no que los contenidos internos son diferentes - en realidad como @nemesisdesign puntas float('int') == float('int')sostiene a True. Este es el mismo problema, como comparar objetos mutables como [1,2,3] es [1,2,3] y [1,2,3] == [1,2,3], que son, en orden, falsos and True .. Más información ver: stackoverflow.com/questions/2988017/…
Manoel Vilela
13

En python2.x hubo un hack sucio que sirvió para este propósito (NUNCA lo use a menos que sea absolutamente necesario):

None < any integer < any string

Por lo tanto, la verificación se i < ''cumple Truepara cualquier número entero i.

Se ha desaprobado razonablemente en python3. Ahora tales comparaciones terminan con

TypeError: unorderable types: str() < int()
Antony Hatchkins
fuente
55
Si realmente tienes que usar esto, al menos envuélvelo en algunos nombres legibles como:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Ali Rasim Kocal
55
Pero no tienes que usar esto.
Joost
3

Además, si usa SymPy, puede usar sympy.oo

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

etc.

Victor VosMottor agradece a Monica
fuente