Domanda

Sto cercando qualche codice Python 2.6 complesso che a volte provoca la generazione di un infinito (almeno un Infinity viene serializzato dalla libreria json - che controlla w / math.isinf).

Ciò che è particolarmente sconcertante è che Python (per quanto posso dire) non dovrebbe mai essere in grado di produrre risultati di calcolo impostati su infinito. Sbaglio con questo assunto? Ero consapevole che puoi ottenere infiniti solo dalle costanti:

k = float('inf')
k = 1e900
È stato utile?

Soluzione

Da qualche parte tra 1e308 e 1e309 i float hanno una precisione insufficiente, quindi se stai calcolando risultati al di sopra di questo intervallo vedrai inf

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

I decimali possono gestire numeri più grandi, ma ovviamente c'è una penalità per le prestazioni (e non può essere serializzata con json)

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

Ecco un esempio di un'aggiunta che non genera un'eccezione di overflow

>>> a=1e308
>>> a+a
inf
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top