無窮大與NaN
問題
你想創建或測試正無窮、負無窮或NaN(非數字)的浮點數。
解決方案
Python並沒有特殊的語法來表示這些特殊的浮點值,但是可以使用 float()
來創建它們。比如:
>>> a = float('inf') >>> b = float('-inf') >>> c = float('nan') >>> a inf >>> b -inf >>> c nan >>>
為了測試這些值的存在,使用 math.isinf()
和 math.isnan()
函數。比如:
>>> math.isinf(a) True >>> math.isnan(c) True >>>
討論
想了解更多這些特殊浮點值的信息,可以參考IEEE 754規范。 然而,也有一些地方需要你特別注意,特別是跟比較和操作符相關的時候。
無窮大數在執行數學計算的時候會傳播,比如:
>>> a = float('inf') >>> a + 45 inf >>> a * 10 inf >>> 10 / a 0.0 >>>
但是有些操作時未定義的並會返回一個NaN結果。比如:
>>> a = float('inf') >>> a/a nan >>> b = float('-inf') >>> a + b nan >>>
NaN值會在所有操作中傳播,而不會產生異常。比如:
>>> c = float('nan') >>> c + 23 nan >>> c / 2 nan >>> c * 2 nan >>> math.sqrt(c) nan >>>
NaN值的一個特別的地方時它們之間的比較操作總是返回False。比如:
>>> c = float('nan') >>> d = float('nan') >>> c == d False >>> c is d False >>>
由於這個原因,測試一個NaN值得唯一安全的方法就是使用 math.isnan()
,也就是上面演示的那樣。
有時候程序員想改變Python默認行為,在返回無窮大或NaN結果的操作中拋出異常。 fpectl
模塊可以用來改變這種行為,但是它在標准的Python構建中並沒有被啟用,它是平台相關的, 並且針對的是專家級程序員。可以參考在線的Python文檔獲取更多的細節。