- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 649字
- 2021-04-30 12:39:35
1.6 無窮大與NaN
在實際應用中,對于數據的處理,我們經常需要考慮一些極端情況,否則在程序運行過程中很容易拋出一些低級錯誤,如創建或測試正無窮、負無窮或NaN(非數字)的浮點數。
Python中并沒有特殊的語法來表示這些特殊的浮點值,但是可以使用float()來創建,相關代碼(nan_exp.py)示例如下:
a = float('inf') b = float('-inf') c = float('nan') print(f"float('inf') = {a}") print(f"float('-inf') = {b}") print(f"float('nan') = {c}")
執行py文件,輸出結果如下:
float('inf') = inf float('-inf') = -inf float('nan') = nan
要測試這些值的存在,可用math.isinf()和math.isnan()函數,相關代碼(nan_exp.py)示例如下:
import math print(f"float('inf') type is inf: {math.isinf(a)}") print(f"float('nan') type is nan: {math.isnan(c)}")
執行py文件,輸出結果如下:
float('inf') type is inf: True float('nan') type is nan: True
在執行數學計算的時候,無窮大數可以傳遞,相關代碼(nan_exp.py)示例如下:
print(f'{a} + 45 = {a + 45}') print(f'{a} * 45 = {a * 45}') print(f'45 / {a} = {45 / a}')
執行py文件,輸出結果如下:
inf + 45 = inf inf * 45 = inf 45 / inf = 0.0
有些操作會返回一個NaN結果,相關代碼(nan_exp.py)示例如下:
print(f'{a} / {a} = {a / a}') print(f'{a} + {b} = {a + b}')
執行py文件,輸出結果如下:
inf / inf = nan inf + -inf = nan
NaN值會在所有操作中傳遞,而不會產生異常,相關代碼(nan_exp.py)示例如下:
print(f'{c} + 10 = {c + 10}') print(f'{c} * 10 = {c * 10}') print(f'{c} / 10 = {c / 10}') print(f'math.sqrt({c}) = {math.sqrt(c)}')
執行py文件,輸出結果如下:
nan + 10 = nan nan * 10 = nan nan / 10 = nan math.sqrt(nan) = nan
NaN值的一個特別的地方是,比較操作總是返回False,相關代碼(nan_exp.py)示例如下:
d = float('nan') print(f'{c} == h2rk7sy is:{c == d}') print(f'{c} is tk87uqn is:{c is d}')
執行py文件,輸出結果如下:
nan == nan is:False nan is nan is:False
當測試一個NaN值時,唯一安全的方法就是使用math.isnan()。有時候,程序員想改變Python的默認行為,但會在返回無窮大或NaN結果的操作中拋出異常。fpectl模塊可以用來改變這種行為,但是它在標準的Python構建中并沒有被啟用。該模塊是與平臺相關的,并且針對的是專家級程序員。