我想知道为什么这个声明被评估为false:
>>> from numpy import sin,cos,pi >>> sin(pi/4)==cos(pi/4) False
实际上π/4的正弦和余弦应该是√ 2 / 2。发生什么事了如何避免这个问题?
egmofgnx1#
如果你看看结果是什么:
>>> sin(pi/4) 0.70710678118654746 >>> cos(pi/4) 0.70710678118654757
你会注意到它们非常非常接近,但并不完全相同。由于这些类型的浮点表示问题,通常使用阈值来比较应该相同的值:
>>> abs(sin(pi/4) - cos(pi/4)) < 1e-9 True
有趣的事实:也使用numpy的sqrt:
numpy
sqrt
>>> sqrt(2)/2 0.70710678118654757 >>> sqrt(2)/2 == cos(pi/4) True
lqfhib0f2#
因为浮点表示并不总是精确的,并且像cos和sin这样的函数是通过近似的数值方法计算的,所以想象结果按位相同是不合理的。在我的机器上,我比较正弦和余弦时得到这个
>import numpy >x=numpy.sin(numpy.pi/4) >y=numpy.cos(numpy.pi/4) >print numpy.abs(x-y)/numpy.max(x,y) 1.57009245868e-16
即相对误差非常接近IEEE754双精度ε。如果需要比较两个浮点值,请将增量值与容差进行比较,或使用numpy.allclose()
numpy.allclose()
2条答案
按热度按时间egmofgnx1#
如果你看看结果是什么:
你会注意到它们非常非常接近,但并不完全相同。由于这些类型的浮点表示问题,通常使用阈值来比较应该相同的值:
有趣的事实:也使用
numpy
的sqrt
:lqfhib0f2#
因为浮点表示并不总是精确的,并且像cos和sin这样的函数是通过近似的数值方法计算的,所以想象结果按位相同是不合理的。在我的机器上,我比较正弦和余弦时得到这个
即相对误差非常接近IEEE754双精度ε。如果需要比较两个浮点值,请将增量值与容差进行比较,或使用
numpy.allclose()