Haskell正弦和余弦函数不起作用

时间:2013-07-10 09:15:18

标签: haskell ghci pi sine

好的,这是一个非常奇怪的问题。

内置的Haskell正弦函数(sin)似乎不起作用。

sin 0正确地给出0

无论出于何种原因,

sin pi都会1.2246467991473532e-16

这些都是使用内置的前奏函数。我只是启动ghci(Haskell解释器),输入sin pi并得到错误的答案。

此外,cos (pi/2)提供了6.123233995736766e-17

为什么会出现这种情况?看起来函数的构建是完全错误的......看起来,Haskell标准库的数学定位是非常不可能的。

编辑:嘿,我只是忽略了e-16 ..我想这就是我深夜编码的原因。谢谢大家!

2 个答案:

答案 0 :(得分:18)

这是Matlab

>> sin(pi)
ans =
  1.2246e-016

这是Python

>>> from math import sin, pi
>>> sin(pi)
1.2246467991473532e-16

您正在遇到浮点精度的限制。我建议阅读What Every Computer Scientist Should Know About Floating Point Arithmetic


这些数字末尾的e表示它们是({3}}的紧凑形式,代表“×10 ^”。例如,在这种表示法中,2e3对应于2×10 3 = 2000.这里,你有一个乘以10 -16 的数字,这是小;写完了,1.2246467991473532e-16 = 0.00000000000000012246467991473532,所以误差量非常小。


如果您想在Haskell中进行准确的实数计算,可以使用CReal包,如下所示。

>>> import Data.Number.CReal
>>> sin (0.0  :: CReal)
0.0
>>> sin (pi   :: CReal)
0.0
>>> cos (pi/2 :: CReal)
0.0

这是有效的,因为“引擎盖下”CReal是一个函数Int -> Integer。给定要输出的数字d,该函数会生成Integer,当除以10^d时,它会将实数更正为d小数位。

答案 1 :(得分:2)

双精度pi本身的误差是-2.3846200000000026e-17,因此像sin这样的函数在精度上输掉另一个小数也不错。