Frage

Ich bin auf der Suche über einig komplexen Python 2.6-Code, der gelegentlich in einer Unendlichkeit wird, was erzeugt wird (zumindest eine Unendlichkeit von der json Bibliothek serialisiert - die w / math.isinf prüft).

Was besonders ist rätselhaft ist, dass Python (soweit ich das beurteilen kann) sollte bis ins Unendliche nicht in der Lage sein, setzen Berechnungsergebnisse zu je produzieren. Bin ich mit dieser Annahme falsch? Ich war klar, man kann nur Unendlichkeiten von Konstanten erhalten:

k = float('inf')
k = 1e900
War es hilfreich?

Lösung

Irgendwo zwischen 1e308 und 1e309 dem Schwimmer aus Präzision ausgeführt werden, so dass, wenn Sie die Ergebnisse über diesem Bereich sind Rechen werden Sie inf sehen

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

Dezimal können größere Zahlen umgehen, aber offensichtlich gibt es eine Leistungseinbuße (und es kann nicht mit Json serialisiert werden)

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

Hier ist ein Beispiel für einen Zusatz, der nicht Überlauf Ausnahme aufwirft

>>> a=1e308
>>> a+a
inf
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top