我在其他问题中读到过,例如sin(2π)由于浮点表示而不是零,但是非常接近。这个非常小的错误在我的代码中没有问题,例如,我可以将5位小数取整
然而,当2π乘以一个非常大的数字时,误差被放大了很多。答案应该是零(或接近),但远非零
我是不是在做一些根本错误的事情?如果不是,我如何避免π的浮点数的误差幅度被“放大”为周期数(2*PI*X)→ ∞ ?
请注意,最后三个结果都是相同的。有人能解释为什么5)的π/2比4大吗?即使窦性曲线有很大的偏移,PI/2的增加仍然会产生一个不同的数值,对吗
检查小数值SIN(2*PI)
print math.sin(math.pi*2)
结果=-2.44929359829e-16与预期一致→ 就我的目的而言,这个误差范围是可以的
向上面的代码添加PI/2:SIN(2*PI+PI/2)
print math.sin((math.pi*2)+(math.pi/2))
结果:预期为1.0
检查非常大的数字SIN(2*PI*非常大的数字)(仍然期望接近零)
print math.sin(math.pi*2*(415926535897932384626433832795028841971693993751))
结果:-0.759488037749不符合预期-->;就我而言,此误差幅度不合适
将PI/2添加到上面的代码中:SIN(2*PI*非常大的数字+PI/2)(期望接近1)
print math.sin((math.pi*2*(415926535897932384626433832795028841971693993751))+(math.pi/2))
如上所述,但我添加了PI/2-预期结果为1.0
结果:-0.759488037749不符合预期-为什么在我添加PI/2时会出现与上述相同的结果(应在窦性曲线上持续四分之一个周期)
将随机数(8)添加到非常大的数字,不应为1或0
print math.sin(math.pi*2*(415926535897932384626433832795028841971693993759))
如上所述,但我添加了8-期望既不得到0也不得到1
结果:-0.759488037749与预期不符-为什么我添加8时的结果与上述结果相同
您可以
% 1
这个非常大的数字:这对于双精度变量根本不起作用
math.pi
的值仅对大约16位小数(二进制中的53位)是正确的,因此当您将其乘以415926535897932384626433832795028841971693993751(159位)这样的数字时,将不可能得到有意义的结果您需要使用任意精度的数学库。例如,尝试使用^{} 。告诉它您需要1000位精度,然后再次尝试求和:
使用的算法是近似的,数值(如pi)是近似的。因此$\pi\cdot{SomeLargeNumber}$将有一个较大的错误(因为$\pi$的值是近似值)。(硬件?)使用的函数将减少参数,可能使用稍有不同的值$\pi$
请注意,浮点运算不满足实数运算的公理
相关问题 更多 >
编程相关推荐