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


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.


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


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

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.


27

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


24

Otra forma menos conveniente de hacerlo es usar Decimalclass:

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

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.