Comment représenter un nombre infini en Python?


560

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.


29
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:

float('inf') < Ellipsis

reviendrait vrai.


15
Et si x est également inf, ce ne sera pas vrai.
Maxim Egorushkin

5
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.
Peter Goldsborough

2
Je suis en 3.5. Probablement une chose 2.x / 3.x.
Peter Goldsborough

80

Depuis Python 3.5, vous pouvez utiliser math.inf:

>>> import math
>>> math.inf
inf

47

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

math.inf

Pour l'infini négatif:

-math.inf

30

Je ne sais pas exactement ce que vous faites, mais float("inf")vous donne un flottant Infinity, qui est supérieur à tout autre nombre.


27

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.


24

Une autre façon, moins pratique, de le faire est d'utiliser la Decimalclasse:

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

21
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

TypeError: unorderable types: str() < int()

5
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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.