如何避免math.sin(math.pi*2*非常大的数字)比math.sin(math.pi*2)有更大的误差?

2024-06-08 05:58:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在其他问题中读到过,例如sin(2π)由于浮点表示而不是零,但是非常接近。这个非常小的错误在我的代码中没有问题,例如,我可以将5位小数取整

然而,当2π乘以一个非常大的数字时,误差被放大了很多。答案应该是零(或接近),但远非零

我是不是在做一些根本错误的事情?如果不是,我如何避免π的浮点数的误差幅度被“放大”为周期数(2*PI*X)→ ∞ ?

请注意,最后三个结果都是相同的。有人能解释为什么5)的π/2比4大吗?即使窦性曲线有很大的偏移,PI/2的增加仍然会产生一个不同的数值,对吗

  1. 检查小数值SIN(2*PI)

    print math.sin(math.pi*2)
    

    结果=-2.44929359829e-16与预期一致→ 就我的目的而言,这个误差范围是可以的

  2. 向上面的代码添加PI/2:SIN(2*PI+PI/2)

    print math.sin((math.pi*2)+(math.pi/2))
    

    结果:预期为1.0

  3. 检查非常大的数字SIN(2*PI*非常大的数字)(仍然期望接近零)

    print math.sin(math.pi*2*(415926535897932384626433832795028841971693993751))
    

    结果:-0.759488037749不符合预期-->;就我而言,此误差幅度不合适

  4. 将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时会出现与上述相同的结果(应在窦性曲线上持续四分之一个周期)

  5. 将随机数(8)添加到非常大的数字,不应为1或0

    print math.sin(math.pi*2*(415926535897932384626433832795028841971693993759))
    

    如上所述,但我添加了8-期望既不得到0也不得到1
    结果:-0.759488037749与预期不符-为什么我添加8时的结果与上述结果相同


Tags: 代码错误pi数字mathsin曲线数值
3条回答

How to avoid math.sin(math.pi*2*VERY LARGE NUMBER) having a much larger error margin than math.sin(math.pi*2)?

您可以% 1这个非常大的数字:

>>> math.sin(math.pi*2*(415926535897932384626433832795028841971693993751))
-0.8975818793257183
>>> math.sin(math.pi*2*(415926535897932384626433832795028841971693993751 % 1))
0.0
>>> math.sin((math.pi*2*(415926535897932384626433832795028841971693993751))+(math.pi/2))
-0.8975818793257183
>>> math.sin((math.pi*2*(415926535897932384626433832795028841971693993751 % 1))+(math.pi/2))
1.0

这对于双精度变量根本不起作用

math.pi的值仅对大约16位小数(二进制中的53位)是正确的,因此当您将其乘以415926535897932384626433832795028841971693993751(159位)这样的数字时,将不可能得到有意义的结果

您需要使用任意精度的数学库。例如,尝试使用^{}。告诉它您需要1000位精度,然后再次尝试求和:

>>> import mpmath
>>> mpmath.mp.prec=1000
>>> print(mpmath.sin((mpmath.pi*2*(415926535897932384626433832795028841971693993751))+(mpmath.pi/2)))
1.0

使用的算法是近似的,数值(如pi)是近似的。因此$\pi\cdot{SomeLargeNumber}$有一个较大的错误(因为$\pi$的值是近似值)。(硬件?)使用的函数将减少参数,可能使用稍有不同的值$\pi$

请注意,浮点运算不满足实数运算的公理

相关问题 更多 >

    热门问题