Python中的inf與nan


Python中可以用如下方式表示正負無窮

>>> float('inf') # 正無窮,inf不區分大小寫,float('InF')一樣可以。
inf
>>> float('-inf') # 負無窮,不區分大小寫。
-inf

當涉及 > 和 < 運算時, 所有數都比 -inf 大 ,所有數都比 +inf 小。
 

>>> float('nan')
nan

nan代表Not A Number(不是一個數),它並不等於0,因為nan不是一個數,所以相關計算都無法得到數字。


正無窮float('inf')

>>> float('inf') + 100
inf
>>> float('inf') - 100
inf
>>> float('inf') * 100
inf
>>> float('inf') / 100
inf
>>> float('inf') + float('inf')
inf
>>> float('inf') - float('inf')
nan
>>> float('inf') * float('inf')
inf
>>> float('inf') / float('inf')
nan
>>> 100 + float('inf')
inf
>>> 100 - float('inf')
-inf
>>> 100 * float('inf')
inf
>>> 100 / float('inf')
0.0

負無窮float('inf')

>>> float('-inf') + 100
-inf
>>> float('-inf') - 100
-inf
>>> float('-inf') * 100
-inf
>>> float('-inf') / 100
-inf
>>> float('-inf') + float('-inf')
-inf
>>> float('-inf') - float('-inf')
nan
>>> float('-inf') * float('-inf')
inf
>>> float('-inf') / float('-inf')
nan
>>> 100 + float('-inf')
-inf
>>> 100 - float('-inf')
inf
>>> 100 * float('-inf')
-inf
>>> 100 / float('-inf')
-0.0

可見,正無窮float('inf')與負無窮float('inf')運算有着異曲同工之妙。


正無窮float('inf')與負無窮float('inf')之間的運算:

>>> float('inf') + float('-inf')
nan
>>> float('inf') - float('-inf')
inf
>>> float('-inf') - float('inf')
-inf
>>> float('inf') * float('-inf')
-inf
>>> float('inf') / float('-inf')
nan
>>> float('-inf') / float('inf')
nan

NaN
所有涉及nan的操作,返回的都是nan。

>>> float('nan') + 100
nan
>>> float('nan') - 100
nan
>>> float('nan') * 100
nan
>>> float('nan') / 100
nan

 
比較操作時,返回的都是False,哪怕兩個float('nan')互相比較都不相等。

>>> float('nan') > float('inf')
False
>>> float('nan') > float('-inf')
False
>>> float('nan') < float('inf')
False
>>> float('nan') < float('-inf')
False
>>> float('nan') == float('nan') # 注意
False

Python中可以用math.isinf()與math.isnan()來判斷數據是否為inf或nan。

>>> import math
>>> math.isinf(float('inf'))
True
>>> math.isinf(float('-inf'))
True
>>> math.isnan(float('nan'))
True

除此之外,還有別的方法可以用來判斷數據是否為inf和nan,但上述方法是最推薦的,所以其他方法不再贅述。


正負無窮與NaN的is和==判斷

>>> 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

首先,對於正負無窮和 NaN 自身與自身用 is 操作,結果都是 True,這里好像沒有什么問題;但是如果用 == 操作,結果卻不一樣了, NaN 這時變成了 False。如果分別用 float 重新定義一個變量來與它們再用 is 和 == 比較,結果仍然出人意料。出現這種情況的原因稍稍有些復雜,這里就不贅術了,感興趣可以查閱相關資料。
既然我在談論這個問題,就再忠告:不要在 Python 中試圖用 is 和 == 來判斷一個對象是否是正負無窮或者 NaN。乖乖的用 math 模塊就OK了,否則就是引火燒身。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM