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

标签 haskell ghci pi trigonometry

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

内置的 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/

相关文章:

algorithm - 以随机顺序嵌套调用

Haskell:为 Fix 类型派生 Show

haskell - 是什么让 Iteratees 值得如此复杂?

windows - Tab 完成和箭头键在 Git Bash 的 GHCI 中不起作用

haskell - 从边列表构造树: missing Leaf nodes

haskell - 来自 GHCi 提示的加载警告

java - 无法以联觉方式绘制像素、Pi 数

haskell - 如何制作 Applicative 的固定长度向量实例?

javascript - unicode 中没有 Pi 上标?

opencv - pkg-config 错误