2009-12-01 51 views
6

我正在查看一些複雜的Python 2.6代碼,它偶爾會導致無限生成(至少一個由json庫序列化的無窮大 - 它會檢查w/math.isinf)。在Python代碼中生成的無窮大

特別令人困惑的是,Python(據我所知)應該無法將計算結果設置爲無窮大。這個假設我錯了嗎?我知道,你只能從常量得到無窮大:

k = float('inf') 
k = 1e900 
+0

嗯......無窮無效是JSON,但是Python會同時序列化和反序列化它。 – Thanatos 2009-12-01 08:38:07

+2

@Thanatos行爲是可配置的http://docs.python.org/library/json.html – 2009-12-01 08:43:30

回答

13

某處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 
+0

正確的,問題是,通過計算,而不是通過const分配生成infinities。我想知道是否有OverflowExceptions會被繞過。 – UsAaR33 2009-12-01 09:05:30

+0

當然可以,我在答案的底部添加了一個示例 – 2009-12-01 10:12:25

+0

您可以定義JSON行爲,就像gnibbler對該問題的評論一樣。你也可以檢查在Python代碼中的浮點數無窮大與 從十進制進位十進制 if Decimal(「%f」%younumber).is_infinite(): raise OverflowError – jsbueno 2009-12-01 11:54:32