2009-10-10 7 views
3

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

+0

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. –

Répondre

5

é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.

+0

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' –

+1

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

+0

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. –

2

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 
1

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 
0

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.

Questions connexes