好的,这是一个非常奇怪的问题。
内置的Haskell正弦函数(sin)似乎不起作用。
sin 0
正确地给出0
。
sin pi
都会1.2246467991473532e-16
这些都是使用内置的前奏函数。我只是启动ghci(Haskell解释器),输入sin pi
并得到错误的答案。
此外,cos (pi/2)
提供了6.123233995736766e-17
为什么会出现这种情况?看起来函数的构建是完全错误的......看起来,Haskell标准库的数学定位是非常不可能的。
编辑:嘿,我只是忽略了e-16 ..我想这就是我深夜编码的原因。谢谢大家!
答案 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这样的函数在精度上输掉另一个小数也不错。