问题
我们如何在 Python 中表示无穷大、负无穷以及 NaN?
如果我们需要对浮点数的无穷大、负无穷以及 NaN 进行判断测试,该怎么做?
解决方案
Python 中没有特殊的语法直接表示这些特殊的浮点数值。但是我们可以通过用浮点数 float() 来创建。示例如下:
a = float('inf')
b = float('-inf')
c = float('nan')
print(a, b, c)
而检测是否出现这些值,可以通过使用 math.isinf() 函数以及 math.isnan() 函数进行判断。
a = float('inf')
b = float('-inf')
c = float('nan')
print(math.isinf(a))
print(math.isinf(b))
print(math.isnan(c))
无穷大 inf 以及 nan 会通过所有的操作进行传播,且不会引发任何异常。
a = float('inf')
print(a + 45) # 输出为:inf
print(10 / a) # 输出为:0.0
c = float('nan')
print(c + 25) # 输出为:nan
print(c * 25) # 输出为:nan
讨论
有关 nan,一个很有意思的点在于,其做相等比较时,从不会被判定为相等,比如:
c = float('nan')
d = float('nan')
print(c == d) # 输出为 False
而正是因为这样,唯一安全检测 NaN 的方法就是使用 math.isnan() 函数。有时候,高级程序员希望能够在出现无穷大或者 NaN 时可以修改 Python 的行为,让它能够抛出异常值。fpectl 模块可以用来调整这个行为,但是在标准的 Python 中并没有开启这个功能,且模块需要与平台高度相关结合,只针对专家级的程序员使用。