Haskell正弦和余弦函数不工作

Haskell正弦和余弦函数不工作,haskell,ghci,pi,trigonometry,Haskell,Ghci,Pi,Trigonometry,好吧,这是个很奇怪的问题 内置的Haskell正弦函数(sin)似乎不起作用 sin0正确地给出了0 sin-pi出于任何原因给出了1.2246467991473532e-16 这些都是使用内置的前奏功能。我只需启动ghci(Haskell解释器),输入sinpi,就可以得到错误的答案 另外,cos(pi/2)给出了6.123233995736766e-17 你知道为什么会这样吗?看起来内置函数根本就错了。。从Haskell标准库的数学取向来看,这似乎是极不可能的 编辑:呵呵,我只是忽略了e-1

好吧,这是个很奇怪的问题

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

sin0
正确地给出了
0

sin-pi
出于任何原因给出了
1.2246467991473532e-16

这些都是使用内置的前奏功能。我只需启动ghci(Haskell解释器),输入
sinpi
,就可以得到错误的答案

另外,
cos(pi/2)
给出了
6.123233995736766e-17

你知道为什么会这样吗?看起来内置函数根本就错了。。从Haskell标准库的数学取向来看,这似乎是极不可能的

编辑:呵呵,我只是忽略了e-16。。我想这就是我在深夜编写代码的原因。谢谢大家

这是Matlab

>> sin(pi)
ans =
  1.2246e-016
这是Python

>>> from math import sin, pi
>>> sin(pi)
1.2246467991473532e-16
你正在接近浮点精度的极限。我建议你读一读


这些数字末尾的
e
表示它们是(的紧凑形式),代表“×10^”。例如,在这种表示法中,
2e3
对应于2×103=2000。这里,你有一个乘以10-16的数字,这个数字很小;完整写出,
1.2246467991473532e-16
=0.0000000000000001246467991473532,因此错误量非常小


如果希望在Haskell中进行精确的实数计算,可以使用
CReal
包,如下所示

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

这是因为“引擎盖下”a
CReal
是一个函数
Int->Integer
。给定要输出的位数
d
,该函数生成
整数
,当除以
10^d
时,该整数将使实数精确到
d
小数位。

双精度pi本身的误差为-2.38462000000000026E-17,因此,对于像sin这样的函数,在精度上再损失一个小数点并不坏。

这里真正的问题是pi本身。我理解浮点精度,只是我没有想到,因为1.2离0很远。你知道,从数学上讲,这么多的错误是有道理的吗?@Nathan结果是
1.22*10^(-16)
,这(相对而言)非常接近于零-大约是
0.000000000000122
@Nathan你看到那里的
e-16
?这意味着结果非常接近于零。哈哈,是的,我刚刚意识到这一点。只是忽略了e-16。这就是我在深夜编写代码的原因。谢谢大家的澄清。也许你应该试试
1+sin pi
,这样你就可以看到它实际上离正确答案有多近。你也可以安装数字软件包,使用类型
Data.Number.CReal.CReal
,而不是
Double
。它既慢又准。