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.
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:
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.
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
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
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 desconhecidasmath.inf
sem precisar de um caso especialNone
ou assumir um limite superior9999999
. Da mesma forma, você pode usar-math.inf
como um valor inicial para problemas de maximização.Respostas:
No Python, você pode fazer:
No Python 3.5, você pode fazer:
E depois:
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:retornaria verdadeiro.
fonte
Ellipsis
, o que compara mais do que tudo, incluindo o infinito.float("inf") < Ellipsis
retorna Truemath.inf < ...
oufloat('inf') > Ellipsis
joga umTypeError: unorderable types: float() < ellipsis()
, pelo menos para mim.Desde o Python 3.5, você pode usar
math.inf
:fonte
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):
Para infinito negativo:
fonte
Não sei exatamente o que você está fazendo, mas
float("inf")
fornece um infinito flutuante, que é maior que qualquer outro número.fonte
Há uma infinidade na biblioteca NumPy:
from numpy import inf
. Para obter infinito negativo, basta escrever-inf
.fonte
Outra maneira, menos conveniente, de fazer isso é usar a
Decimal
classe:fonte
Decimal('Infinity') == float('inf')
retornaTrue
, então é praticamente o mesmo.float('inf') is float('inf')
retornaFalse
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 pontasfloat('int') == float('int')
detém aTrue
. 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/…No python2.x, havia um hack sujo que atendia a esse propósito (NUNCA use-o, a menos que seja absolutamente necessário):
Assim, a verificação
i < ''
valeTrue
para qualquer número inteiroi
.Foi razoavelmente obsoleto no python3. Agora, essas comparações terminam com
fonte
MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Além disso, se você usa o SymPy, pode usar
sympy.oo
etc.
fonte