首页  >  文章  >  后端开发  >  为什么 C/C 的 `sin()` 和 `cos()` 函数对于 180 度等已知角度会产生意想不到的结果?

为什么 C/C 的 `sin()` 和 `cos()` 函数对于 180 度等已知角度会产生意想不到的结果?

Linda Hamilton
Linda Hamilton原创
2024-11-24 07:00:13684浏览

Why are C/C  's `sin()` and `cos()` functions producing unexpected results for known angles like 180 degrees?

正弦和余弦函数对于已知角度产生意外结果

问题:

使用时C/C 的 cos() 和 sin() 函数,角度为180度,得到的结果与预期值有较大偏差,如sin(0.0547)和cos(0.99)。相反,这些函数返回 sin(3.5897934739308216e-009) 和 cos(-1.00000)。

有问题的代码:

double radians = DegreesToRadians(angle);
double cosValue = cos(radians);
double sinValue = sin(radians);

DegreesToRadians() 转换度数的位置使用弧度公式:

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

解释:

C/C 的三角函数(sin()、cos()、tan() 等)需要其以弧度而不是角度输入。代码中提供的 DegreesToRadians() 函数使用 PI 作为常数,提供度数到弧度的近似转换。然而,近似值会引入舍入误差,并且 M_PI 的使用可能无法与 π 的数学值精确对齐。

此外,将转换后的弧度直接传递给 sin() 和 cos() 函数可以进一步放大这些值错误,导致某些结果不正确

解决方案:

要解决此问题,可以在调用三角函数之前执行角度减小。该技术将角度减小到 -45° 到 45° 之间的范围,解决舍入误差问题。例如,考虑下面的 sind() 函数:

double sind(double x) {
  if (!isfinite(x)) {
    return sin(x);
  }
  if (x < 0.0) {
    return -sind(-x);
  }
  int quo;
  double x90 = remquo(fabs(x), 90.0, &amp;quo);
  switch (quo % 4) {
    case 0:
      // Use * 1.0 to avoid -0.0
      return sin(d2r(x90)* 1.0);
    case 1:
      return cos(d2r(x90));
    case 2:
      return sin(d2r(-x90) * 1.0);
    case 3:
      return -cos(d2r(x90));
  }
  return 0.0;
}

该函数封装了角度缩减逻辑,并确保各种角度(包括 180 度)的结果更准确。

以上是为什么 C/C 的 `sin()` 和 `cos()` 函数对于 180 度等已知角度会产生意想不到的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn