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算術嗎?還是有更簡單的方法?
哎呀。但是,謝謝,「不」仍然是一個答案。我想我希望有一些我不知道的標準庫模塊(我稱它爲「sanefloat」,帶有一個名爲「理智」的上下文管理器,所以每個人都冷漠地從sanefloat進口清單中寫下......)理智:...') – detly 2010-09-23 07:26:42
我個人發現數學錯誤的例外比通過值默默傳播NaNs更加理智,而INF通常會更好地避免,因爲它們通常將FPU放在一個緩慢的路徑中,儘管在Python中這一點很不重要。我認爲實現這樣的東西需要高性能的TLS,我想這是Python核心想要避免需要的東西... – 2010-09-23 07:42:55
這取決於上下文。如果有人在'c'框中輸入10,在'd'框輸入1,我寧願只在結果框中顯示'inf'。而且,一旦你寫了超過10個這樣的功能,你真的很感到厭倦每次都會遇到同樣的三個例外。 – detly 2010-09-23 08:44:06