第五章:数学运算-math:数学函数-测试异常值

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。
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/88066930