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.

ssierral
la source
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.

WilHall
la source
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
à droite
la source
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
Sнаđошƒаӽ
la source
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.

Ned Batchelder
la source
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.

Lenar Hoyt
la source
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')
Denis Malinovsky
la source
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()
Antony Hatchkins
la source
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
3

De plus, si vous utilisez SymPy, vous pouvez utiliser sympy.oo

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

etc.

Victor VosMottor remercie Monica
la source