2010-09-23 58 views
2

我正在寫一個簡單的應用程序,它接收一堆數字輸入並計算一組結果。 (該應用程序是在PyGTK的,但我不認爲這是相關的。)在Python中處理特殊的浮點值

我的問題是,如果我想只是有NaN的和INF的通過傳播,然後在計算我需要做的是這樣的:

# At the top of the module 
nan = float("nan") 
inf = float("inf") 

try: 
    res = (a + b)/(0.1*c + d) 
except ZeroDivisionError: 
    # replicate every little subtlety of IEEE 754 here 
except OverflowError: 
    # replicate every little subtlety of IEEE 754 here again 

...或者,當然,搶先它計算:

numerator = a + b 
denominator = 0.1*c + d 

if denominator == 0: 
    # etc 
elif math.isnan(numerator): 
    # *sigh* 

我怎樣才能在Python 2.6三立面對呢?我真的需要在每臺目標機器上安裝一個龐大的第三方模塊(numpy,scipy)來做IEEE 754算術嗎?還是有更簡單的方法?

回答

2

不,Python的內置數學引發錯誤的異常,而不是將它們作爲NaN和INF返回。如果您不想要這種行爲,您需要使用庫或自己的代碼。

(想我給的答案很簡單,因爲在那裏,答案是「對不起,沒有」根本就沒有得到回答太多的問題。)

+0

哎呀。但是,謝謝,「不」仍然是一個答案。我想我希望有一些我不知道的標準庫模塊(我稱它爲「sanefloat」,帶有一個名爲「理智」的上下文管理器,所以每個人都冷漠地從sanefloat進口清單中寫下......)理智:...') – detly 2010-09-23 07:26:42

+0

我個人發現數學錯誤的例外比通過值默默傳播NaNs更加理智,而INF通常會更好地避免,因爲它們通常將FPU放在一個緩慢的路徑中,儘管在Python中這一點很不重要。我認爲實現這樣的東西需要高性能的TLS,我想這是Python核心想要避免需要的東西... – 2010-09-23 07:42:55

+0

這取決於上下文。如果有人在'c'框中輸入10,在'd'框輸入1,我寧願只在結果框中顯示'inf'。而且,一旦你寫了超過10個這樣的功能,你真的很感到厭倦每次都會遇到同樣的三個例外。 – detly 2010-09-23 08:44:06