R:奇怪的三角函数行为

时间:2011-04-27 15:44:24

标签: r trigonometry

作为一个过渡到R的Matlab用户,我遇到了将三角函数应用于度数的问题。在Matlab中,有弧度和度数的三角函数(例如分别为cos和cosd)。 R似乎只包含弧度函数,因此需要我创建自己的函数(见下文)

cosd<-function(degrees) {
  radians<-cos(degrees*pi/180)
  return(radians)
}

不幸的是,此功能始终无法正常工作。一些结果如下所示。

> cosd(90)
[1] 6.123234e-17
> cosd(180)
[1] -1
> cosd(270)
[1] -1.836970e-16
> cosd(360)
[1] 1

我想了解导致此问题的原因以及如何解决此问题。谢谢!

5 个答案:

答案 0 :(得分:8)

这是浮点运算:

> all.equal(cosd(90), 0)
[1] TRUE
> all.equal(cosd(270), 0)
[1] TRUE

如果你的意思是“无法正常工作”?

这也是常见问题:http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f

答案 1 :(得分:5)

看起来它对我来说很好。 pi的值可能不够精确,所以你得到了非常接近的估计。如果你考虑一下,6.123234e-17和-1.836970e-16非常非常接近0,这就是答案。

你的问题在于,虽然纸上90 * pi / 180 = pi / 2,但在计算机中,我们使用浮点数。我不确定R / matlab使用什么,但我肯定猜测是32位还是64位浮点数。并且您只能在有限数量的位中输入如此多的信息,因此您无法存储每个可能的小数。

您可以修改您的功能,以便给定90或270,返回0。

答案 2 :(得分:1)

这是一个浮点表示错误。请参阅http://lib.stat.cmu.edu/s/Spoetry/Tutor/R_inferno.pdf

的第1章

答案 3 :(得分:1)

相同的原因
1-(1/3)-(1/3)-(1/3)

不等于0.它与浮点数有关。我相信会有更详细的说明。

答案 4 :(得分:1)

您可能还对zapsmall函数感兴趣,以便将接近0的数字显示为0。