5.4.2 测试异常值
浮点数计算可能导致两种类型的异常值。第一种inf(无穷大),当用double存储一个浮点值,而该值会从一个具有很大绝对值的值上溢出时,就会出现这个异常值。
import math
print('{:^3} {:6} {:6}'.format('e','x','x**2','isinf'))
print('{:-^3} {:-^6} {:-^6}'.format('','','',''))
for e in range(0,201,20):
x = 10.0 ** e
y = x * x
print('{:3d} {:<6g} {:<6g} {!s:6}'.format(e,x,y,math.isinf(y)))
当这个例子中的指数变得足够大时,x的平方无法再存放与一个double中,这个值就会被记录为无穷大。
运行结果:
不过,并不是所有浮点数溢出都会导致inf值。具体地,用浮点值计算一个指数时,会生成OverflowError而不是保留inf结果。
x =10.0 ** 200
print('x =',x)
print('x*x =',x * x)
print('x**2 =',end=' ')
try:
print(x ** 2)
except OverflowError as err:
print(err)
这种差异是由C和Pyhton所用库中的实现差别造成的。
运行结果:
使用无穷大值的除法运算未定义。将一个除数以无穷大值的结果是nan(不是一个数)。
import math
x = (10.0 ** 200) * (10.0 ** 200)
y = x / x
print('x =',x)
print('isnan(x) =',math.isnan(x))
print('y = x / x =',x / x)
print('y == nan =',y == float('nan'))
print('is nan(y) =',math.isnan(y))
nan不等于任何值,甚至不等于其自身,所以要想检查nan,需要使用isnan()。
运行结果:
可以使用isfinite()检查其是普通的数还是特殊值inf或nan。
import math
for f in [0.0,1.0,math.pi,math.e,math.inf,math.nan]:
print('{:5.2f} {!s}'.format(f,math.isfinite(f)))
如果是特殊值inf或nan,则isfinite()返回false,否则返回true。
运行结果: