购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅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构建中并没有被启用。该模块是与平台相关的,并且针对的是专家级程序员。 M1/NVoQ1H4Tdx+woQtSMmn3dv8tfCPCuHjej7meB/e0YEQFw+2OlCu0fdMvozVMq

点击中间区域
呼出菜单
上一章
目录
下一章
×