gpt4 book ai didi

haskell - 为什么地板会失去精度,它如何影响平等的传递性?

转载 作者:行者123 更新时间:2023-12-02 16:40:41 25 4
gpt4 key购买 nike

我首先定义一个大整数n:

Prelude> let n = 5705979550618670446308578858542675373983
Prelude> n :: Integer
5705979550618670446308578858542675373983

接下来我查看了 s1s2 的行为:

Prelude> let s1 = (sqrt (fromIntegral n))^2
Prelude> let s2 = (floor(sqrt(fromIntegral n)))^2

Prelude> s1 == fromIntegral n
True
Prelude> s1 == fromIntegral s2
True
Prelude> (fromIntegral n) == (fromIntegral s2)
False

由于任何小数部分都可能被丢弃,因此最后 2 个表达式不相等。然而,我没想到相等是不及物的(例如n == s1, s1 == s2,但是n != s2。)

此外,尽管保留了 40 位有效数字,floor 似乎还是失去了整数部分的精度。

Prelude> s1
5.70597955061867e39

Prelude> s2
5705979550618669899723442048678773129216

在测试减法时,这种精度损失变得很明显:

Prelude> (fromIntegral n) - s1
0.0

Prelude> (fromIntegral n) - (fromIntegral s2)
546585136809863902244767

为什么floor会失去精度,这如何违反了平等的传递性(如果有的话)?

计算floor 的最佳方法是什么。 sqrt 不会损失精度?

最佳答案

损失精度的不是floor,而是从Integer(任意精度整数)到Double( float )的转换。点值,精度有限)。因此,fromIntegral n::Double 不再与 n 相同。

Double 有一个 53 位尾数(52 位显式存储,前导一位隐式存储),大约相当于 16 位十进制数字。因此,结果中只有(大约)16 个最高有效位有效。其余的只是噪音。

最后,前两次比较比较的是 Double;和n转换Doubles2转换Double code> 和 s1 都是相等的。然而,在第三次比较中,ns2 都是 Integer;它们可以作为 Integer 进行比较,因此对它们调用 fromIntegral 是无操作,并且它们的未转换整数值是不同的。如果强制转换为 Double,这些值将再次变得相等:

Prelude> ((fromIntegral n) :: Double) == ((fromIntegral s2) :: Double)
True

关于haskell - 为什么地板会失去精度,它如何影响平等的传递性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18240641/

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