使用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