¿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.
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:
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í.
¿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
Si realmente tienes que usar esto, al menos envuélvelo en algunos nombres legibles como:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
math.inf
es ú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 desconocidasmath.inf
sin necesidad de utilizar un caso especialNone
o asumir un límite superior9999999
. Del mismo modo, puede usarlo-math.inf
como valor inicial para problemas de maximización.Respuestas:
En Python, puedes hacer:
En Python 3.5, puedes hacer:
Y entonces:
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:Volvería cierto.
fuente
Ellipsis
, que se compara más que todo, incluido el infinito.float("inf") < Ellipsis
devuelve Truemath.inf < ...
ofloat('inf') > Ellipsis
lanza unTypeError: unorderable types: float() < ellipsis()
, al menos para mí.Desde Python 3.5 puedes usar
math.inf
:fuente
Nadie parece haber mencionado explícitamente el infinito negativo, por lo que creo que debería agregarlo.
Para el infinito positivo (solo por completar):
Para infinito negativo:
fuente
No sé exactamente lo que estás haciendo, pero
float("inf")
te da un infinito flotante, que es mayor que cualquier otro número.fuente
Existe una infinidad en la biblioteca NumPy:
from numpy import inf
. Para obtener el infinito negativo, uno simplemente puede escribir-inf
.fuente
Otra forma menos conveniente de hacerlo es usar
Decimal
class:fuente
Decimal('Infinity') == float('inf')
regresaTrue
, así que es más o menos lo mismo.float('inf') is float('inf')
regresaFalse
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 puntasfloat('int') == float('int')
sostiene aTrue
. 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/…En python2.x hubo un hack sucio que sirvió para este propósito (NUNCA lo use a menos que sea absolutamente necesario):
Por lo tanto, la verificación se
i < ''
cumpleTrue
para cualquier número enteroi
.Se ha desaprobado razonablemente en python3. Ahora tales comparaciones terminan con
fuente
MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Además, si usa SymPy, puede usar
sympy.oo
etc.
fuente