大家都知道 在Python 中可以用如下方式表示正負無窮:
float("inf") # 正無窮float("-inf") # 負無窮
利用 inf(infinite)
乘以 0 會得到 not-a-number(NaN)
。如果一個數超出 infinite,那就是一個 NaN(not a number)
數。在 NaN 數中,它的 exponent 部分為可表達的最大值,即 FF(單精度)、7FF(雙精度)和 7FFF(擴展雙精度)。 NaN 數與 infinite 數的區別是:infinite 數的 significand 部分為 0 值(擴展雙精度的 bit63 位為 1);而 NaN 數的 significand 部分不為 0 值。
我們先看看如下的代碼:
>>> inf = float("inf")>>> ninf = float("-inf")>>> nan = float("nan")>>> inf is infTrue>>> ninf is ninfTrue>>> nan is nanTrue>>> inf == infTrue>>> ninf == ninfTrue>>> nan == nanFalse>>> inf is float("inf")False>>> ninf is float("-inf")False>>> nan is float("nan")False>>> inf == float("inf")True>>> ninf == float("-inf")True>>> nan == float("nan")False
如果你沒有嘗試過在 Python 中判斷一個浮點數是否為 NaN,對以上的輸出結果肯定會感到詫異。首先,對于正負無窮和 NaN 自身與自身用 is 操作,結果都是 True,這里好像沒有什么問題;但是如果用 == 操作,結果卻不一樣了, NaN 這時變成了 False。如果分別用 float 重新定義一個變量來與它們再用 is 和 == 比較,結果仍然出人意料。出現這種情況的原因稍稍有些復雜,這里就不贅術了,感興趣可以查閱相關資料。
如果你希望正確的判斷 Inf 和 Nan 值,那么你應該使用 math 模塊的 math.isinf
和 math.isnan
函數:
>>> import math>>> math.isinf(inf)True>>> math.isinf(ninf)True>>> math.isnan(nan)True>>> math.isinf(float("inf"))True>>> math.isinf(float("-inf"))True>>> math.isnan(float("nan"))True
這樣便準確無誤了。既然我在談論這個問題,就是再忠告:不要在 Python 中試圖用 is 和 == 來判斷一個對象是否是正負無窮或者 NaN。你就乖乖的用 math 模塊吧,否則就是引火燒身。
當然也有別的方法來作判斷,以下用 NaN 來舉例,但仍然推薦用 math 模塊,免得把自己弄糊涂。
用對象自身判斷自己
>>> def isnan(num):... return num != num... >>> isnan(float("nan"))True
用 numpy 模塊的函數
>>> import numpy as np>>> >>> np.isnan(np.nan)True>>> np.isnan(float("nan"))True>>> np.isnan(float("inf"))False
Numpy 的 isnan 函數還可以對整個 list 進行判斷:
新聞熱點
疑難解答