小编Dvi*_*ius的帖子

haskell浮点计算异常?

使用ghci 8.6.5

我想计算一个整数输入的平方根,然后将其四舍五入到底部并返回一个整数。

square :: Integer -> Integer
square m = floor $ sqrt $ fromInteger m
Run Code Online (Sandbox Code Playgroud)

有用。问题是,对于此特定的大数字作为输入:

4141414141414141 * 4141414141414141

我得到一个错误的结果。

放下我的功能,我在ghci中测试了这种情况:

> sqrt $ fromInteger $ 4141414141414141*4141414141414141
4.1414141414141405e15
Run Code Online (Sandbox Code Playgroud)

错...对吗?

简单地

> sqrt $ 4141414141414141*4141414141414141
4.141414141414141e15
Run Code Online (Sandbox Code Playgroud)

这更像我从计算中所期望的...

在我的函数中,我必须进行一些类型转换,我认为fromIntegral是必经之路。因此,使用该函数,我的函数对于4141 ... 41输入给出了错误的结果。

在运行sqrt之前,我无法弄清楚ghci在类型转换方面的隐含功能。因为ghci的转换允许正确的计算。

为什么我说这是异常现象:其他数字(如5151515151515151或3131313131313131或4242424242424242)不会发生此问题...

这是Haskell错误吗?

floating-point precision haskell largenumber type-conversion

5
推荐指数
2
解决办法
132
查看次数