上QQ阅读APP看书,第一时间看更新
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} == {d} is:{c == d}') print(f'{c} is {d} is:{c is d}')
执行py文件,输出结果如下:
nan == nan is:False nan is nan is:False
当测试一个NaN值时,唯一安全的方法就是使用math.isnan()。有时候,程序员想改变Python的默认行为,但会在返回无穷大或NaN结果的操作中抛出异常。fpectl模块可以用来改变这种行为,但是它在标准的Python构建中并没有被启用。该模块是与平台相关的,并且针对的是专家级程序员。