gpt4 book ai didi

Haskell 大数计算

转载 作者:行者123 更新时间:2023-12-02 10:48:23 25 4
gpt4 key购买 nike

我正在尝试用大数字进行一些计算

λ: let r  = 291381631919914084
λ: let t = 1165526527679656343
λ: sqrt(4 * r * r - 4 * r + 1 + 8 * t) - 2 * r + 1
1.0

答案应该是8.0000...我应该使用一个包来进行此类计算吗?或者我应该在前奏中做些什么?

最佳答案

正确答案确实非常接近8.0。您遇到了数值精度问题:平方根是使用 IEEE 754(“ double ”)二进制 64 格式计算的,其 53 位精度不足以在此处给出准确的结果。

更详细地说:sqrt(4 * r * r - 4 * r + 1 + 8 * t) 的真实值为 50 位有效数字:

582763263839828175.00000000000000000686385063746811

与该数量最接近的可表示 IEEE 754 二进制 64 值是:

582763263839828224.0

...与真实值相差约 49.0。同样,值 2*r 在转换为浮点时会丢失精度。

您可能会想通过提高精度来解决此问题,但正如数值工作中经常发生的情况一样,在这种情况下,最好重新设计算法以避免(或至少改善)数值问题。您计算的值的形式为 sqrt(a * a + b) - a(其中 a = 2 * r - 1b = 8 *t)。该数量可以用 b/(sqrt(a * a + b) + a) 的形式重写,并且(假设 ab code> 为正),后一个表达式将给出更准确的结果。

以下是两个表达式给出相同结果的快速演示。

Prelude> let a = 43
Prelude> let b = 7
Prelude> sqrt(a * a + b) - a
8.131845707602992e-2
Prelude> b / (sqrt(a * a + b) + a)
8.131845707603225e-2

我们使用较小的 ab 值,因此数字问题并没有那么严重,但请注意,最后 4 位数字仍然存在差异。 (此处的确切值是 0.081318457076032250005683932322636450,精确到 35 位有效数字。)

并将这种形式的表达式与您的值一起使用:

Prelude> let r = 291381631919914084
Prelude> let t = 1165526527679656343
Prelude> let a = 2*r - 1; b = 8*t in b / (sqrt(a*a+b) + a)
8.0

正如其他回答者所指出的,答案不完全8.0,但是8.0最接近真实答案的 IEEE 754 二进制 64 浮点值。

关于Haskell 大数计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45108774/

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