问题
创建或测试正无穷(inf)
、负无穷(-inf)
或NaN
等非数字的浮点数。
解决方案
Python并没有特殊的语法来表示这些特殊的浮点值,但是可以使用 float()
来创建它们。比如:
print(float('-inf'))
print(float('inf'))
print(float('nan'))
-inf
inf
nan
为了测试这些值的存在,使用 math.isinf()
和 math.isnan()
函数。比如:
import math
print(math.isinf(float('inf')))
print(math.isnan(float('nan')))
True
True
讨论
想了解更多这些特殊浮点值的信息,可以参考IEEE 754规范。 也有一些地方需要特别注意,特别是跟比较和操作符相关的时候。
无穷大数在执行数学计算的时候会传播,比如:
a = float('inf')
print(a + 40)
print(a * 10)
print(10 / a)
inf
inf
0.0
有些操作未定义,但会返回一个NaN结果。比如:
a = float('inf')
b = float('-inf')
print(a / a)
print(a + b)
nan
nan
NaN值会在所有操作中传播,而不会产生异常。比如:
c = float('nan')
print(c + 23)
print(c / 2)
nan
nan
NaN值的一个特别的地方是它们之间的比较操作总是返回False。比如:
c = float('nan')
d = float('nan')
print(c == d)
False
由于这个原因,测试一个NaN值的唯一安全的方法是使用 math.isnan()
。