Je rétroportage mon projet de Python 2.6 à Python 2.4 et 2.5. Dans mon projet j'ai utilisé float("inf")
, et maintenant je trouve qu'il est indisponible sur Python 2.5. Y a-t-il un backport?Backporting float ("inf") vers Python 2.4 et 2.5
Répondre
J'ai créé un backport, testé sur Python 2.5+, peut probablement être facilement fait de travailler sur Python 2.4:
https://github.com/cool-RR/GarlicSim/blob/master/garlicsim/garlicsim/general_misc/infinity.py
épelant soit le long chemin ou le chemin court fonctionne bien pour moi:
$ python2.4 -c "print float('inf')+200"
inf
$ python2.5 -c "print float('inf')+200"
inf
$ python2.5 -c "print float('infinity')+200"
inf
$ python2.4 -c "print float('infinity')+200"
inf
Le drapeau -c
signifie « exécuter les arguments suivants en tant que commande Python. »
PEP754 (qui a été rejetée) ne mentionne votre problème sur les valeurs spéciales IEEE-754. Il suggère d'utiliser quelque chose comme 1e300000
pour générer un débordement à virgule flottante et créer inf
, mais il note que c'est moche et pas garanti d'être portable.
Je ne sais pas ce que cet indicateur '-c' est, mais en Python 2.4 sous Windows XP, il semble qu'il n'y ait pas de float ('inf')', ni 'float ('infinity')'. Il soulève: 'ValueError: littéral invalide pour float(): inf' –
Python float utilise des flottants matériels, donc le comportement peut dépendre de la plate-forme. Pour les modifications, voir "De nombreuses fonctionnalités à virgule flottante ont été ajoutées". http://docs.python.org/whatsnew/2.6.html – u0b34a0f6ae
fonctionne pour moi sur linux python 2.4.3 et osx python 2.5.6; La plate-forme Win32 ne suit pas la sémantique IEEE, ou vous avez une très ancienne version de Python. –
Vous devriez être en mesure de faire semblant en donnant à Python une constante à virgule flottante suffisamment grande à la place. Par exemple:
>>> 1e100000
inf
>>> float('inf') == 1e1000000
True
>>> float('inf') == 2e1000000
True
Le module decimal est disponible depuis Python 2.4 et prend en charge les décimales infinies positives ou négatives. Il ne se comporte pas toujours comme un flottant (par exemple en ajoutant un nombre décimal et un flottant n'est pas supporté) mais fait la bonne chose pour la comparaison, ce qui était assez bon pour moi.
>>> decimal.Decimal('Infinity') > 1e300
True
emprunt NumPy pour quelques lignes:
import numpy as np
inf = float(np.inf)
Ici, inf
est un regular python float
, donc vous n'avez plus besoin de vous embêter avec NumPy.
L'astuce 1e100000 échoue de manière aléatoire sur Windows XP. Il devient parfois juste 1.0. Donc, c'est hors de question. Il doit y avoir une classe pour l'Infini. –