- 无穷大和NaN
- 问题:
- 创建或测试正无穷、负无穷或NaN(非数字)的浮点数。
- 解决方案:
- Python 并没有特殊的语法来表示这些特殊的浮点值,但是可以用 float() 来创建它们。比 如:
a = float("inf")
b = float("-inf")
c = float("nan")
print(a) # inf
print(b) # -inf
print(c) # nan
- 为了测试这些值得存在,使用 math.isinf() 和 math.isnan() 函数。比如:
import math
print(math.isinf(a)) # True
print(math.isnan(c)) # True
- 讨论: 有一些地方需要特别注意,例如,比较和操作符相关的时候。
- 无穷大数在执行数学计算的时候会传播,比如:
a = float("inf")
print(a + 45) # inf
print(a*10) # inf
print(10/a) # 0.0
a = float("inf")
print(a/a) # nan
b = float("-inf")
print(a + b) # nan
- NaN 值会再所有操作中传播,不会产生异常。比如:
c = float("nan")
print(c + 23) # nan
- NaN 值一个特别的地方是他们之间的比较操作总是返回 False,比如:
c = float("nan")
d = float("nan")
print(c == d) # False
- 由于这个原因,测试一个 NaN值唯一安全的办法就是使用 math.isnan(),也就是上面例子 中那样。
- 有时候想改变 Python 默认行为,在返回无穷大或者 NaN 结果的操作抛出异常。fpectl 模块可以用来改变这种行为,但它在标准的 Python 构建中并没有启用,是与平台相关的, 并且针对的是。。。。(比较牛逼的人)。