浮点数 math.cos 不准确
float point math.cos inaccuracy
我们知道 cos(2mPI) = 1 ,对于每个整数 m。
但是,我得到以下输出。
value of m = 1.000000e+01 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+02 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+03 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+04 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+05 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+06 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+07 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+08 and value of cos(2*m*pi) = 0.999999999999997
value of m = 1.000000e+09 and value of cos(2*m*pi) = 0.999999999999998
value of m = 1.000000e+10 and value of cos(2*m*pi) = 0.999999999989970
value of m = 1.000000e+11 and value of cos(2*m*pi) = 0.999999999564035
value of m = 1.000000e+12 and value of cos(2*m*pi) = 0.999999854510183
value of m = 1.000000e+13 and value of cos(2*m*pi) = 0.999985451053279
value of m = 1.000000e+14 and value of cos(2*m*pi) = 0.999742535619873
value of m = 1.000000e+15 and value of cos(2*m*pi) = 0.888410566323832
value of m = 1.000000e+16 and value of cos(2*m*pi) = 0.718430574337184
value of m = 1.000000e+17 and value of cos(2*m*pi) = -0.438105159926831
value of m = 1.000000e+18 and value of cos(2*m*pi) = 0.176561618304251
value of m = 1.000000e+19 and value of cos(2*m*pi) = -0.114036978390490
value of m = 1.000000e+20 and value of cos(2*m*pi) = 0.689416156299807
为什么我们不能总是计算出正确的输出?随着 m 的值变大,近似值变化 significantly.Not 确定是哪种类型的浮点错误导致了这种情况。有帮助吗?
可能是因为圆周率本身的值(计算机表示,而不是数学值)不准确。
它可能是 3.141592653589
(这是我脑海中唯一能记住的)但是,除非你有无限多的位来存储它(或者你使用符号而不是二进制-编码形式),它永远不会完全准确。
并且,当您将它乘以更大的整数时,不精确性可能会增加。
浮点表示的变幻莫测是众所周知的,以至于您只能从 IEEE754 双精度表示中获得大约 15 位的精度。给 PI 需要大约……好吧……永无止境的位数,必须给点东西。
我不完全确定什么样的应用程序会使用像 10<sup>20</sup>π
这样的值,我不假装知道你的情况,但你 可能 想考虑尝试将值限制在更大的 "sensible" 范围内,例如 [0,2π)
.
最接近 PI 的 64 位浮点数(我称之为 piDouble
)与 PI 的精确值 piExact
之间的差值约为 1.22E-16。差异 m*piExact - m*piDouble == m*(piExact - piDouble)
大约是 m*1.22E-16
.
像余弦这样的函数是通过首先将角度减小到一个相对较小的角度范围来计算的,在这个范围内库可以很好地近似余弦。
随着 m 变大,m*1.22E-16
首先变得足够重要,然后在角度减小结果中占主导地位。
我们知道 cos(2mPI) = 1 ,对于每个整数 m。 但是,我得到以下输出。
value of m = 1.000000e+01 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+02 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+03 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+04 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+05 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+06 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+07 and value of cos(2*m*pi) = 1.000000000000000
value of m = 1.000000e+08 and value of cos(2*m*pi) = 0.999999999999997
value of m = 1.000000e+09 and value of cos(2*m*pi) = 0.999999999999998
value of m = 1.000000e+10 and value of cos(2*m*pi) = 0.999999999989970
value of m = 1.000000e+11 and value of cos(2*m*pi) = 0.999999999564035
value of m = 1.000000e+12 and value of cos(2*m*pi) = 0.999999854510183
value of m = 1.000000e+13 and value of cos(2*m*pi) = 0.999985451053279
value of m = 1.000000e+14 and value of cos(2*m*pi) = 0.999742535619873
value of m = 1.000000e+15 and value of cos(2*m*pi) = 0.888410566323832
value of m = 1.000000e+16 and value of cos(2*m*pi) = 0.718430574337184
value of m = 1.000000e+17 and value of cos(2*m*pi) = -0.438105159926831
value of m = 1.000000e+18 and value of cos(2*m*pi) = 0.176561618304251
value of m = 1.000000e+19 and value of cos(2*m*pi) = -0.114036978390490
value of m = 1.000000e+20 and value of cos(2*m*pi) = 0.689416156299807
为什么我们不能总是计算出正确的输出?随着 m 的值变大,近似值变化 significantly.Not 确定是哪种类型的浮点错误导致了这种情况。有帮助吗?
可能是因为圆周率本身的值(计算机表示,而不是数学值)不准确。
它可能是 3.141592653589
(这是我脑海中唯一能记住的)但是,除非你有无限多的位来存储它(或者你使用符号而不是二进制-编码形式),它永远不会完全准确。
并且,当您将它乘以更大的整数时,不精确性可能会增加。
浮点表示的变幻莫测是众所周知的,以至于您只能从 IEEE754 双精度表示中获得大约 15 位的精度。给 PI 需要大约……好吧……永无止境的位数,必须给点东西。
我不完全确定什么样的应用程序会使用像 10<sup>20</sup>π
这样的值,我不假装知道你的情况,但你 可能 想考虑尝试将值限制在更大的 "sensible" 范围内,例如 [0,2π)
.
最接近 PI 的 64 位浮点数(我称之为 piDouble
)与 PI 的精确值 piExact
之间的差值约为 1.22E-16。差异 m*piExact - m*piDouble == m*(piExact - piDouble)
大约是 m*1.22E-16
.
像余弦这样的函数是通过首先将角度减小到一个相对较小的角度范围来计算的,在这个范围内库可以很好地近似余弦。
随着 m 变大,m*1.22E-16
首先变得足够重要,然后在角度减小结果中占主导地位。