C#中的Math.Cos和Math.Sin

ela*_*ick 8 c# trigonometry

我正在尝试一些我认为应该相当简单的事情.我有一个角度,一个位置和一个距离,我想从这些信息中找到X,Y坐标.

使用90度的示例输入,我使用以下代码将值转换为弧度:

public double DegreeToRadian(float angle)
{
  return Math.PI * angle / 180.0;
}
Run Code Online (Sandbox Code Playgroud)

这给了我1.5707963267949弧度然后当我使用

Math.Cos(radians)
Run Code Online (Sandbox Code Playgroud)

我最终得到了一个答案:6.12303176911189E-17

到底他妈发生了什么?90度的余弦应该是0,所以为什么我会得到这样的偏差...更重要的是我怎么能阻止它呢?

Dar*_*rov 14

让我用另一个回答你的问题:你认为6.12303176911189E-17从0开始有多远?您所谓的偏差实际上是由于浮点数在内部存储的方式.我建议你阅读以下文章.在.NET中,它们使用IEEE 754标准存储.

  • 应用一些基本的三角法,两个粒子在一个光年中的距离与角度误差为6.1E-17*9.4E15~ = 0.57 = 57cm.我认为这两者都不值得担心. (2认同)

小智 7

你应该使用舍入

var radians = Math.PI * degres / 180.0;
var cos = Math.Round(Math.Cos(radians), 2);
var sin = Math.Round(Math.Sin(radians), 2);
Run Code Online (Sandbox Code Playgroud)

结果将是: sin: 1 cos: 0


Edw*_*aal 6

见上面的答案.请记住,6.12303176911189E-17是0.00000000000000006(我甚至可能错过了零!)所以这是一个非常非常小的偏差.