Question

J'examine un code Python 2.6 complexe qui entraîne parfois la génération d'un infini (au moins un Infinity est sérialisé par la bibliothèque json - qui vérifie w / math.isinf).

Ce qui est particulièrement déroutant, c’est que Python (pour autant que je sache) ne devrait pas être en mesure de produire des résultats de calcul à l’infini. Est-ce que je me trompe avec cette hypothèse? J'étais conscient que vous ne pouvez obtenir l'infini que des constantes:

k = float('inf')
k = 1e900
Était-ce utile?

La solution

Quelque part entre 1e308 et 1e309, les flottants manquent de précision. Par conséquent, si vous calculez les résultats au-dessus de cette plage, vous verrez

>>> 1e308
1e+308
>>> 1e309
inf

>>> json.dumps(1e308,allow_nan=False)
'1e+308'
>>> json.dumps(1e309,allow_nan=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
    chunks = list(self.iterencode(o))
  File "/usr/lib/python2.6/json/encoder.py", line 304, in _iterencode
    yield floatstr(o, self.allow_nan)
  File "/usr/lib/python2.6/json/encoder.py", line 47, in floatstr
    raise ValueError(msg)
ValueError: Out of range float values are not JSON compliant: inf
>>> 

Decimal peut gérer des nombres plus grands, mais il y a évidemment une baisse de performance (et il ne peut pas être sérialisé avec json)

>>> from decimal import Decimal
>>> Decimal('1e900')/10
Decimal("1E+899")

Voici un exemple d'ajout qui ne génère pas d'exception de dépassement de capacité

>>> a=1e308
>>> a+a
inf
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top