官术网_书友最值得收藏!

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構建中并沒有被啟用。該模塊是與平臺相關的,并且針對的是專家級程序員。

主站蜘蛛池模板: 海盐县| 大兴区| 伽师县| 内江市| 盐源县| 宜川县| 荣成市| 海安县| 徐州市| 新津县| 准格尔旗| 眉山市| 休宁县| 永嘉县| 嘉荫县| 台中县| 织金县| 三明市| 吉水县| 长丰县| 乐清市| 扬中市| 安福县| 江川县| 济宁市| 鄂伦春自治旗| 广元市| 尖扎县| 铜鼓县| 文水县| 海南省| 莱西市| 喀喇| 南通市| 河源市| 忻城县| 潞城市| 乐昌市| 鲜城| 福鼎市| 札达县|