我正在查看一些複雜的Python 2.6代碼,它偶爾會導致無限生成(至少一個由json庫序列化的無窮大 - 它會檢查w/math.isinf)。在Python代碼中生成的無窮大
特別令人困惑的是,Python(據我所知)應該無法將計算結果設置爲無窮大。這個假設我錯了嗎?我知道,你只能從常量得到無窮大:
k = float('inf')
k = 1e900
我正在查看一些複雜的Python 2.6代碼,它偶爾會導致無限生成(至少一個由json庫序列化的無窮大 - 它會檢查w/math.isinf)。在Python代碼中生成的無窮大
特別令人困惑的是,Python(據我所知)應該無法將計算結果設置爲無窮大。這個假設我錯了嗎?我知道,你只能從常量得到無窮大:
k = float('inf')
k = 1e900
某處1e308之間1e309彩車用完的精度,所以如果你的計算高於該範圍的結果,你會看到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
>>>
小數可以處理更大的數字,但是很顯然在性能上的損失(而不能使用JSON序列化)
>>> from decimal import Decimal
>>> Decimal('1e900')/10
Decimal("1E+899")
這裏是一個除了一點不RA的例子ise溢出異常
>>> a=1e308
>>> a+a
inf
正確的,問題是,通過計算,而不是通過const分配生成infinities。我想知道是否有OverflowExceptions會被繞過。 – UsAaR33 2009-12-01 09:05:30
當然可以,我在答案的底部添加了一個示例 – 2009-12-01 10:12:25
您可以定義JSON行爲,就像gnibbler對該問題的評論一樣。你也可以檢查在Python代碼中的浮點數無窮大與 從十進制進位十進制 if Decimal(「%f」%younumber).is_infinite(): raise OverflowError – jsbueno 2009-12-01 11:54:32
嗯......無窮無效是JSON,但是Python會同時序列化和反序列化它。 – Thanatos 2009-12-01 08:38:07
@Thanatos行爲是可配置的http://docs.python.org/library/json.html – 2009-12-01 08:43:30