作为一个过渡到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
我想了解导致此问题的原因以及如何解决此问题。谢谢!
答案 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。