我计算一个值的余弦的结果略有不同。如何检查这种差异是否在机器精度范围内?
import math
math.cos(60.0/180.0*math.pi)
-> 0.5000000000000001
import numpy
numpy.cos(60.0/180.0*numpy.pi)
-> 0.50000000000000011
答案 0 :(得分:10)
差异似乎只是由格式化例程引起的:
>>> '%.30f' % math.cos(60./180.*math.pi)
'0.500000000000000111022302462516'
>>> '%.30f' % np.cos(60./180.*np.pi)
'0.500000000000000111022302462516'
请注意np.cos
返回np.float64
而不是float
,显然默认情况下该类型的打印方式不同。在通用硬件上,它们都实现为64位double
,因此精度没有实际差异。
答案 1 :(得分:4)
Double precision算术为您提供15-16位十进制有效数字的精度。这两个值同意这种精确度。这里没什么可担心的。
请注意,我说 decimal 与用于双精度值的二进制表示中的有效数字的53 二进制位形成对比。
答案 2 :(得分:2)
即使您的数字相同,但了解如何以完全精确的方式检查它们仍然很有用。以下是一些方法:
>>> a = 1.1 + 2.2
>>> b = 3.3
>>> a == b
False
>>> from decimal import Decimal
>>> Decimal.from_float(a)
Decimal('3.300000000000000266453525910037569701671600341796875')
>>> Decimal.from_float(b)
Decimal('3.29999999999999982236431605997495353221893310546875')
>>> a.hex()
'0x1.a666666666667p+1'
>>> b.hex()
'0x1.a666666666666p+1'
>>> a.as_integer_ratio()
(7430939385161319, 2251799813685248)
>>> b.as_integer_ratio()
(3715469692580659, 1125899906842624)