2009-10-10 35 views
3

我將我的項目從Python 2.6移植到Python 2.4和2.5。在我的項目中,我使用了float("inf"),現在我發現它在Python 2.5中不可用。它有回報嗎?將浮點數(「inf」)反向移植到Python 2.4和2.5中

+0

1e100000技巧在Windows XP上隨機失敗。它有時變成1.0。所以這是不可能的。 Infinity需要有一堂課。 – 2009-10-11 22:21:22

回答

5

拼寫,要麼很長的路要走或短的路對我來說工作得很好:

$ python2.4 -c "print float('inf')+200" 
inf 
$ python2.5 -c "print float('inf')+200" 
inf 
$ python2.5 -c "print float('infinity')+200" 
inf 
$ python2.4 -c "print float('infinity')+200" 
inf 

-c標誌的意思是「執行下面的參數作爲一個Python的命令。」

PEP754(已被拒絕)的確提到了有關特殊IEEE-754值的問題。它建議使用類似1e300000的東西來產生浮點溢出並創建inf,但它確實注意到這是醜陋的,並且不能保證是可移植的。

+0

我不知道'-c'標誌是什麼,但在Windows XP上的Python 2.4中似乎沒有float('inf')',也沒有'float('infinity')'。它引發了:'ValueError:float():inf' – 2009-10-10 16:06:47

+1

Python float使用硬件浮點數,所以行爲可能取決於平臺。有關更改,請參閱「添加了許多浮點功能。」 http://docs.python.org/whatsnew/2.6.html – u0b34a0f6ae 2009-10-10 16:18:08

+0

適用於我在Linux上的python 2.4.3和osx python 2.5.6; win32平臺不遵循IEEE語義,或者你有一個非常古老的python版本。 – 2013-07-09 09:34:57

2

您應該可以通過給Python一個足夠大的浮點常量來代替它。例如:

>>> 1e100000 
inf 
>>> float('inf') == 1e1000000 
True 
>>> float('inf') == 2e1000000 
True 
1

decimal模塊是因爲Python 2.4可用並支持正或負無窮大小數。它並不總是表現得像一個浮點數(例如,增加一個小數點和一個浮點數不被支持),但做比較是正確的,這對我來說已經足夠好了。

>>> decimal.Decimal('Infinity') > 1e300 
True 
0

借用NumPy的幾行:

import numpy as np 

inf = float(np.inf) 

在這裏,inf是一個regular python float,所以你不需要進一步打擾NumPy。