Comment représenter un nombre infini en python? Quel que soit le nombre que vous entrez dans le programme, aucun nombre ne doit être supérieur à cette représentation de l'infini.
math.infest utile comme valeur initiale dans les problèmes d'optimisation, car il fonctionne correctement avec min, par exemple. min(5, math.inf) == 5. Par exemple, dans les algorithmes de chemin le plus court, vous pouvez définir des distances inconnues à math.infsans avoir besoin de cas particulier Noneou supposer une limite supérieure 9999999. De même, vous pouvez utiliser -math.infcomme valeur de départ pour les problèmes de maximisation.
Colonel Panic du
Dans la plupart des cas, une alternative à l'utilisation de math.inf dans les problèmes d'optimisation consiste à commencer par la première valeur.
Tobias Bergkvist
Réponses:
708
En Python, vous pouvez faire:
test = float("inf")
En Python 3.5, vous pouvez faire:
import math
test = math.inf
Et alors:
test >1
test >10000
test > x
Sera toujours vrai. Sauf bien sûr, comme indiqué, x est aussi infini ou "nan" ("pas un nombre").
De plus (Python 2.x UNIQUEMENT), par rapport à Ellipsis, float(inf)est moindre, par exemple:
Notez que l'infini est défini dans la norme IEEE 754-1985 ( en.wikipedia.org/wiki/IEEE_754-1985 ), sur laquelle toute langue moderne s'appuiera. Un autre point est que, selon cette norme, l'infini doit (évidemment) être un nombre à virgule flottante. Cela pourrait expliquer pourquoi Python a choisi cette syntaxe akward.
quickbug
3
Cela ne sera pas vrai non plus si x est intégré Ellipsis, ce qui se compare plus que tout, y compris l'infini. float("inf") < Ellipsisrenvoie True
Singletoned
2
Pas sûr du dernier, math.inf < ...ou float('inf') > Ellipsisjette un TypeError: unorderable types: float() < ellipsis(), au moins pour moi.
pourquoi n'ajoutez-vous pas pourquoi c'est moins pratique et pourquoi quelqu'un devrait l'utiliser ?
Niccolò
4
Voyons voir: Decimal('Infinity') == float('inf')revient True, donc c'est à peu près la même chose.
Denis Malinovsky
8
@afzal_SH float('inf') is float('inf')revient Falseaussi
nemesisdesign
4
l'infini est différent même de lui-même, donc votre commentaire n'a pas beaucoup de sens pour moi, à mon
humble avis
5
float('inf') is float('inf')-> False, juste soutient que ce sont des objets différents avec différentes instances, mais pas que le contenu interne sont différentes - en fait comme @nemesisdesign pointu float('int') == float('int')tient à True. C'est le même problème que de comparer des objets mutables comme [1,2,3] est [1,2,3] et [1,2,3] == [1,2,3], qui sont, dans l'ordre, Faux and True .. Plus d'informations voir: stackoverflow.com/questions/2988017/…
Manoel Vilela
13
Dans python2.x, il y avait un hack sale qui servait à cet effet (NE JAMAIS l'utiliser sauf si absolument nécessaire):
None< any integer < any string
Ainsi, la vérification i < ''est valable Truepour tout entier i.
Il a été raisonnablement déprécié en python3. Maintenant, ces comparaisons se retrouvent avec
Si vous avez vraiment besoin de l'utiliser, enveloppez-le au moins dans des noms lisibles comme:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Ali Rasim Kocal
5
Mais vous n'êtes pas obligé de l'utiliser.
Joost
3
De plus, si vous utilisez SymPy, vous pouvez utiliser sympy.oo
math.inf
est utile comme valeur initiale dans les problèmes d'optimisation, car il fonctionne correctement avec min, par exemple.min(5, math.inf) == 5
. Par exemple, dans les algorithmes de chemin le plus court, vous pouvez définir des distances inconnues àmath.inf
sans avoir besoin de cas particulierNone
ou supposer une limite supérieure9999999
. De même, vous pouvez utiliser-math.inf
comme valeur de départ pour les problèmes de maximisation.Réponses:
En Python, vous pouvez faire:
En Python 3.5, vous pouvez faire:
Et alors:
Sera toujours vrai. Sauf bien sûr, comme indiqué, x est aussi infini ou "nan" ("pas un nombre").
De plus (Python 2.x UNIQUEMENT), par rapport à
Ellipsis
,float(inf)
est moindre, par exemple:reviendrait vrai.
la source
Ellipsis
, ce qui se compare plus que tout, y compris l'infini.float("inf") < Ellipsis
renvoie Truemath.inf < ...
oufloat('inf') > Ellipsis
jette unTypeError: unorderable types: float() < ellipsis()
, au moins pour moi.Depuis Python 3.5, vous pouvez utiliser
math.inf
:la source
Personne ne semble avoir mentionné explicitement l'infini négatif, donc je pense que je devrais l'ajouter.
Pour l'infini positif (juste pour être complet):
Pour l'infini négatif:
la source
Je ne sais pas exactement ce que vous faites, mais
float("inf")
vous donne un flottant Infinity, qui est supérieur à tout autre nombre.la source
Il y a une infinité dans la bibliothèque NumPy:
from numpy import inf
. Pour obtenir l'infini négatif, il suffit d'écrire-inf
.la source
Une autre façon, moins pratique, de le faire est d'utiliser la
Decimal
classe:la source
Decimal('Infinity') == float('inf')
revientTrue
, donc c'est à peu près la même chose.float('inf') is float('inf')
revientFalse
aussifloat('inf') is float('inf')
->False
, juste soutient que ce sont des objets différents avec différentes instances, mais pas que le contenu interne sont différentes - en fait comme @nemesisdesign pointufloat('int') == float('int')
tient àTrue
. C'est le même problème que de comparer des objets mutables comme [1,2,3] est [1,2,3] et [1,2,3] == [1,2,3], qui sont, dans l'ordre, Faux and True .. Plus d'informations voir: stackoverflow.com/questions/2988017/…Dans python2.x, il y avait un hack sale qui servait à cet effet (NE JAMAIS l'utiliser sauf si absolument nécessaire):
Ainsi, la vérification
i < ''
est valableTrue
pour tout entieri
.Il a été raisonnablement déprécié en python3. Maintenant, ces comparaisons se retrouvent avec
la source
MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
De plus, si vous utilisez SymPy, vous pouvez utiliser
sympy.oo
etc.
la source