2012-04-04 45 views
38

分當我做浮點除法在Python,如果我除以零,我得到一個異常:如何獲得NaN當我由零

>>> 1.0/0.0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: float division 

我真的很想得到NaNInf代替(因爲NaNInf將通過我的計算其餘正確地傳播,而不是殺死我的程序)。

我該怎麼做?

+3

實際上'NaN'或'Inf'除以零? – beerbajay 2012-04-04 13:13:00

+8

@beerbajay:'0.0/0.0' - >'nan','1.0/0.0' - >'inf','-1.0/0.0' - >'-inf'。 – 2012-04-04 13:14:09

+0

其實非常有趣的是改變Python的行爲,所以它真的適用於'1.0/0',沒有明確地重新輸入所有內容或放任何東西 - 除了在任何地方。 – Fenikso 2012-04-04 13:30:18

回答

48

獲得這種行爲的最簡單的方法是使用numpy.float64,而不是Python的默認float類型:

>>> import numpy 
>>> numpy.float64(1.0)/0.0 
inf 

當然這需要NumPy的。您可以使用numpy.seterr()來微調錯誤處理。

+0

這很好。您甚至可以將'numpy.float64'值傳遞給SWIG封裝的C庫,沒有任何問題。 – 2012-04-04 20:23:17

+1

什麼甚至有'浮(「INF」)'和'浮動(「男」)'內置於Python的,如果你有使用第三方庫,以獲得預期的行爲的意義呢?也就是說,看起來像顯式輸入'float('inf')'是唯一一次我可以依靠看到Python返回的'inf'結果。 – Brandin 2016-01-18 14:18:11

+0

第一次運行這個時,它會拋出一個錯誤。 – becko 2017-11-24 13:40:30

19

方法1:

try: 
    value = a/b 
except ZeroDivisionError: 
    value = float('Inf') 

方法2:

if b != 0: 
    value = a/b 
else: 
    value = float('Inf') 

但要知道,該值可能也被-Inf,因此你應該做一個比較有特色的測試。儘管如此,上面的這個應該會讓你知道如何去做。

+0

我發現新的'math.inf'有點更好閱讀。 – 2016-02-16 22:25:13

+0

@NeilG如果有的話,當然。早在2012年它就不存在了...... – glglgl 2016-02-17 07:07:24

+0

哦!不知何故,我認爲這是一個新問題。無論如何,它的版本爲3。5 – 2016-02-17 07:23:37

6

您可以嘗試使用「十進制」模塊:

>>> from decimal import * 
>>> setcontext(ExtendedContext) 
>>> inf = Decimal(1)/Decimal(0) 
>>> print(inf) 
Infinity 
>>> neginf = Decimal(-1)/Decimal(0) 
>>> print(neginf) 
-Infinity 
>>> print(neginf + inf) 
NaN 
>>> print(neginf * inf) 
-Infinity 
>>> print(dig/0) 
Infinity 
-3

如果我理解你的問題正確那麼這應該是解決方案:

try: 
    1.0/0.0 
except:  
    return 'inf' 

你可以根據不同的Python異常修改了它可用的處理方法

+6

更好的'float('inf')'而不是'inf'' - 那麼你會得到一個浮點數,而不是字符串... – glglgl 2012-04-05 10:59:20

+8

除ZeroDivisionError之外的更好的'',''除了''''''也能捕獲'KeyboardInterrupt'等。 – Marian 2012-11-07 13:34:55

-4

我在我的一個蟒程序中使用的包裝函數的簡單除法這是返回ZeroDivisionError當傳感器我使用沒有插入。它只是返回0(零),這在現實世界中是我想要的。可能會有更多的變量雜亂,但是...

def calculation(a, b): 
    if a == 0: 
     return 0 
    elif b == 0: 
     return 0 
    else: 
     return a/b 
+0

對不起,我忘了修改這個問題,但你所要做的就是將零改爲「NaN」我相信。 – 2015-07-15 15:17:55

+0

這不是一個通用的解決方案。例如。我不希望a/0.0給0,我也不期望它給NaN。 – Brandin 2016-01-18 14:55:05