如何将角度转换为弧度?

3

我有以下函数用于将弧度转换为角度:

float DegreesToRadians(float degrees) {
    return degrees * (PI / 180);
}

当我现在执行以下操作:

sinf(DegreesToRadians(90));

这里预期返回1。但是当我执行以下代码时:
sinf(DegreesToRadians(180));

返回值为-8.74228e-08。有没有人知道为什么会这样?(cosf也会出现类似的情况,但是顺序相反:180 -> -1;90 -> -8.74228e-08)


2
你无法精确地表示 PI / 180 的正确值。 - Andy Turner
1
类型为 float 的精度有限。尝试使用 double,您将获得约为 e-16 的结果。 - Bob__
根据安迪的评论,考虑使用(通常定义的)常量M_PI - enhzflep
2
除了树莓派的特定问题外,还有一个与浮点数学相关的一般性问题需要您注意:SO:浮点数学是否有缺陷? 有一个子学科 数值分析来处理这些问题。 - Scheff's Cat
具体来说,关于正弦和余弦,您可能会注意到函数图在某些区间内具有较低的斜率(约为0),而在其他区间内具有较高的斜率(接近1或-1)。在接近0的区间内进行反向计算通常不太精确。这可以通过巧妙的替换来改善,而正弦和余弦是很好的例子。(其中sin(x)的斜率接近0,cos(x)的斜率接近1或-1,反之亦然。) - Scheff's Cat
标准库里面什么都没有吗? - Sandburg
2个回答

5

如何将角度转换为弧度?

原帖中的角度转弧度的转换方法是合理的。

return degrees * (PI / 180);

当我执行sinf(DegreesToRadians(180));时,它返回-8.74228e-08。这不符合OP的期望,因为没有精确执行degrees * (PI / 180),因为PI不是π @Andy TurnerPI是一个附近可表示的π值。 π是无理数。所有有限浮点值都是有理数。无法完全执行non_zero_degrees * (π / 180)。逼近误差在sinf()调用中被放大。 sinf(DegreesToRadians(180))的结果不是sine(π),而是sine(PI)PI接近π,但并不相同。double graphical example

相反,首先将角度范围缩小以保持三角恒等式的准确性。

示例


4

你的PI是真正的数学常数的近似值。那么,你的角度到弧度的转换也是一个近似值,因为浮点数计算是一种近似值。然后,标准的sinf函数近似了数学中的正弦函数。因此,你应该期望你的结果是近似的。-8.74228e-08是接近于0的数字。它是一个近似值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接