好吧,这是一个非常奇怪的问题。
内置的 Haskell 正弦函数 (sin) 似乎不起作用。sin 0
正确给出 0
.sin pi
无论出于何种原因,1.2246467991473532e-16
这些正在使用内置的前奏功能。我只需启动 ghci(Haskell 解释器),然后输入 sin pi
并得到错误的答案。
另外,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
您遇到了浮点精度的限制。我建议阅读 What Every Computer Scientist Should Know About Floating Point Arithmetic .
e
这些数字的末尾表示它们处于(紧凑形式)scientific notation ,代表“×10^”。例如,在这个符号中,2e3
对应于 2 × 103 = 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
小数位。
关于Haskell 正弦和余弦函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17566768/