gpt4 book ai didi

python - 使用 Numpy 缓解浮点逼近问题

转载 作者:行者123 更新时间:2023-12-01 07:38:34 25 4
gpt4 key购买 nike

我的代码非常简单,只有 1 行导致问题:

np.tan(np.radians(旋转))

我得到的结果不是 rotation = 45 的预期输出 1,而是 0.9999999999999999。我知道 0 和大量 9 是 1。然而,在我的用例中,这似乎是肯定会在迭代中积累的类型。

导致浮点错误的原因:np.tannp.radians,以及无论浮点不准确如何,如何使问题函数正确输出?

编辑:

我应该澄清一下,我熟悉浮点不准确的情况。我担心的是,当这个数字被相乘、相加和比较时,1e-6 错误突然成为一个切实的问题。我通常能够安全地忽略浮点问题,但现在我更担心错误的累积。我想减少出现此类错误的可能性。

编辑2:

我当前的解决方案是四舍五入到小数点后 8 位,因为这很可能就足够了。这是一种临时解决方案,因为我更喜欢一种绕过 IEEE 十进制表示形式的方法。

最佳答案

What is causing the floating point error: np.tan or np.radians, and how do I get the problem function to come out correctly regardless of floating point inaccuracies?

这两个函数都会产生舍入误差,因为在这两种情况下都无法用浮点表示准确的结果。

My current solution is to just round to 8 decimal places because that's most likely enough. It's sort of a temporary solution because I'd much prefer a way to get around the IEEE decimal representations.

这个问题与十进制表示无关,除了上面提到的具体情况之外,这会产生更糟糕的结果,例如

>>> np.tan(np.radians(60))
1.7320508075688767
>>> round(np.tan(np.radians(60)), 8)
1.73205081
>>> np.sqrt(3) # sqrt is correctly rounded, so this is the closest float to the true result
1.7320508075688772

如果您绝对需要比从上面的代码中获得的 15 位十进制数字更高的精度,那么您可以使用任意精度库,例如 gmpy2 .

关于python - 使用 Numpy 缓解浮点逼近问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56838431/

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