【问题标题】:R: Strange trig function behaviorR:奇怪的三角函数行为
【发布时间】:2011-04-28 04:15:29
【问题描述】:

作为过渡到 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

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

【问题讨论】:

    标签: r trigonometry


    【解决方案1】:

    这是浮点运算:

    > 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

    【讨论】:

      【解决方案2】:

      看起来它对我来说工作正常。 pi 的值可能不够精确,因此您得到的估计值非常接近。仔细想想,6.123234e-17 和 -1.836970e-16 非常非常接近于 0,这应该是答案。

      您的问题在于,虽然 90*pi/180 = pi/2 在纸上,但在计算机中,我们使用浮点数。我不确定 R/matlab 使用什么,但我肯定会猜测 32 位或 64 位浮点数。而且您只能在有限的位数中容纳这么多信息,因此您无法存储所有可能的小数。

      你可以修改你的函数,让给定 90 或 270,返回 0。

      【讨论】:

        【解决方案3】:

        这是一个浮点表示错误。见http://lib.stat.cmu.edu/s/Spoetry/Tutor/R_inferno.pdf第1章

        【讨论】:

          【解决方案4】:

          同样的原因

          1-(1/3)-(1/3)-(1/3)
          

          不等于0。它与浮点数有关。我相信会有更多的阐述。

          【讨论】:

            【解决方案5】:

            您可能还对 zapsmall 函数感兴趣,它可以通过另一种方式将接近 0 的数字显示为 0。

            【讨论】:

              猜你喜欢
              • 2015-12-06
              • 2015-04-07
              • 2017-09-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-03
              • 2011-06-14
              相关资源
              最近更新 更多