Como posso representar um número infinito em Python?

559

Como posso representar um número infinito em python? Independentemente do número digitado no programa, nenhum número deve ser maior que essa representação do infinito.

ssierral
fonte
29
math.infé útil como valor inicial em problemas de otimização, porque funciona corretamente com min, por exemplo. min(5, math.inf) == 5. Por exemplo, nos algoritmos de caminho mais curto, você pode definir distâncias desconhecidas math.infsem precisar de um caso especial Noneou assumir um limite superior 9999999. Da mesma forma, você pode usar -math.infcomo um valor inicial para problemas de maximização.
Coronel Panic
Na maioria dos casos, uma alternativa ao uso do math.inf em problemas de otimização é começar com o primeiro valor.
Tobias Bergkvist

Respostas:

707

No Python, você pode fazer:

test = float("inf")

No Python 3.5, você pode fazer:

import math
test = math.inf

E depois:

test > 1
test > 10000
test > x

Sempre será verdade. A menos, é claro, como apontado, x também é infinito ou "nan" ("não é um número").

Além disso (apenas em Python 2.x), em comparação com Ellipsis, float(inf)é menor, por exemplo:

float('inf') < Ellipsis

retornaria verdadeiro.

WilHall
fonte
15
E se x também é inf, isso não será verdade.
Maxim Egorushkin 15/10/11
5
Observe que o infinito é definido na norma IEEE 754-1985 ( en.wikipedia.org/wiki/IEEE_754-1985 ), na qual qualquer linguagem moderna confiará . Outro ponto é que, de acordo com essa norma, o infinito deve (obviamente) ser um número de ponto flutuante. Isso pode explicar por que o Python escolheu essa sintaxe desagradável.
quickbug
3
Também não será verdade se x for incorporado Ellipsis, o que compara mais do que tudo, incluindo o infinito. float("inf") < Ellipsisretorna True
Singleton
2
Não tenho certeza sobre o último, math.inf < ...ou float('inf') > Ellipsisjoga um TypeError: unorderable types: float() < ellipsis(), pelo menos para mim.
Peter Goldsborough
2
Estou no 3.5. Provavelmente uma coisa 2.x / 3.x.
22826 Peter Goldsborough #
80

Desde o Python 3.5, você pode usar math.inf:

>>> import math
>>> math.inf
inf
destro
fonte
47

Parece que ninguém mencionou explicitamente o infinito negativo, então acho que devo adicioná-lo.

Para infinito positivo (apenas por uma questão de completude):

math.inf

Para infinito negativo:

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

Não sei exatamente o que você está fazendo, mas float("inf")fornece um infinito flutuante, que é maior que qualquer outro número.

Ned Batchelder
fonte
27

Há uma infinidade na biblioteca NumPy: from numpy import inf. Para obter infinito negativo, basta escrever -inf.

Lenar Hoyt
fonte
24

Outra maneira, menos conveniente, de fazer isso é usar a Decimalclasse:

from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')
Denis Malinovsky
fonte
21
por que você não acrescenta por que é menos conveniente e por que alguém deveria usá-lo ?
Niccolò
4
Vamos ver: Decimal('Infinity') == float('inf')retorna True, então é praticamente o mesmo.
Denis Malinovsky
8
@afzal_SH também float('inf') is float('inf')retornaFalse
nemesisdesign
4
infinito é diferente, mesmo de si mesmo, para que o seu comentário não faz muito sentido para mim, IMHO
nemesisdesign
5
float('inf') is float('inf')-> False, apenas afirma que eles são diferentes objetos com diferentes instâncias, mas não que o conteúdo interno são diferentes - na verdade como @nemesisdesign pontas float('int') == float('int')detém a True. Esse é o mesmo problema, como comparar objetos mutáveis ​​como [1,2,3] é [1,2,3] e [1,2,3] == [1,2,3], que são, em ordem, False e True .. Mais informações em: stackoverflow.com/questions/2988017/…
Manoel Vilela
13

No python2.x, havia um hack sujo que atendia a esse propósito (NUNCA use-o, a menos que seja absolutamente necessário):

None < any integer < any string

Assim, a verificação i < ''vale Truepara qualquer número inteiro i.

Foi razoavelmente obsoleto no python3. Agora, essas comparações terminam com

TypeError: unorderable types: str() < int()
Antony Hatchkins
fonte
5
Se você realmente tem yo uso isso, pelo menos envolvê-la em alguns nomes legíveis como:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Ali Rasim Kocal
5
Mas você não precisa usar isso.
Joost
3

Além disso, se você usa o SymPy, pode usar sympy.oo

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

etc.

Victor VosMottor agradece Monica
fonte