首頁  >  文章  >  後端開發  >  關於Python中Inf與Nan的判斷問題詳解

關於Python中Inf與Nan的判斷問題詳解

高洛峰
高洛峰原創
2017-02-10 10:02:462245瀏覽

這篇文章主要介紹了關於Python中Inf與Nan的判斷問題,文中介紹的很詳細,對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。

大家都知道 在Python 中可以用以下方式表示正負無窮:

float("inf") # 正无穷
float("-inf") # 负无穷

利用 inf(infinite) 乘以 0 會得到 not-a-n(NN(Naumber)。如果一個數字超出 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 inf
True
>>> ninf is ninf
True
>>> nan is nan
True
>>> inf == inf
True
>>> ninf == ninf
True
>>> nan == nan
False
>>> 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 模組的函數


用numpy 模組的函數

>>> import numpy as np
>>> 
>>> np.isnan(np.nan)
True
>>> np.isnan(float("nan"))
True
>>> np.isnan(float("inf"))
False

這裡的

np.isnan

返回布林值數組,如果對應位置為NaN,返回True,否則返回False。

更多關於Python中Inf與Nan的判斷問題詳解相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn