gpt4 book ai didi

python - 如何避免 math.sin(math.pi*2*VERY LARGE NUMBER) 的误差范围比 math.sin(math.pi*2) 大得多?

转载 作者:行者123 更新时间:2023-12-02 06:56:51 29 4
gpt4 key购买 nike

我在其他问题中读到,例如由于浮点表示,sin(2π) 不为零,但非常接近。这个非常小的错误在我的代码中不是问题,因为例如我可以四舍五入 5 位小数。

但是当2π乘以一个非常大的数时,误差就会放大很多。答案应该是零(或接近),但离它还很远。

我的想法是不是做错了什么?如果不是,如何避免 π 的 float 误差幅度被“放大”为周期数 (2*PI*X) → ∞ ?

请注意,最后 3 个结果都是相同的。谁能解释为什么即使 5) 正好 PI/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*VERY LARGE NUMBER)(仍期望接近零)

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

    结果:-0.759488037749 不符合预期 --> 这个误差范围不适合我的目的

  4. 将 PI/2 添加到上面的代码中:SIN(2*PI*VERY LARGE NUMBER + 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 时结果与上面相同

最佳答案

这根本不适用于 double 变量。

math.pi 的值仅正确到小数点后 16 位(二进制为 53 位),因此当您将其乘以 415926535897932384626433832795028841971693993751(159 位)等数字时,结果将是不可能获得有意义的结果。

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

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

关于python - 如何避免 math.sin(math.pi*2*VERY LARGE NUMBER) 的误差范围比 math.sin(math.pi*2) 大得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60565407/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com