首页  >  文章  >  后端开发  >  为什么 C/C \ 的 cos() 和 sin() 函数对于 180 度等公角会产生意外结果?

为什么 C/C \ 的 cos() 和 sin() 函数对于 180 度等公角会产生意外结果?

Patricia Arquette
Patricia Arquette原创
2024-11-27 12:00:16714浏览

Why Do C/C  's cos() and sin() Functions Produce Unexpected Results for Common Angles Like 180 Degrees?

C/C 的 cos() 和 sin() 对于熟悉的角度的意外结果

对 C/C 的 cos 应用 180 度的角度时() 和 sin() 函数,可能会出现不正确的结果。这可能会令人惊讶,因为我们预计结果为:

  • sin of 0.0547
  • cos of 0.99

但是,实际结果通常有所不同:

  • 罪恶3.5897934739308216e-009
  • cos of -1.00000

这种差异源于 C/C 中 cos(a)、sin(a) 和 tan(a) 函数的事实期望弧度作为参数,而不是角度。从 180 度转换为弧度有时会引入近似值。

即使使用正确的弧度计算,由于 double 的有限精度以及 PI 的潜在错误表示,结果仍可能会出现偏差。

为了解决这个问题,最好在调用 trig 函数之前减少参数的度数。通过将角度限制在 -45° 到 45° 之间,我们确保了结果的准确性。

例如,考虑以下代码,它使用参数缩减以度为单位计算 sin():

#include <math.h>
#include <stdio.h>

static double d2r(double d) {
  return (d / 180.0) * ((double) M_PI);
}

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, &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;
}

int main(void) {
  int i;
  for (i = -360; i <= 360; i += 15) {
    printf("sin()  of %.1f degrees is  % .*e\n", 1.0 * i, DBL_DECIMAL_DIG - 1,
        sin(d2r(i)));
    printf("sind() of %.1f degrees is  % .*e\n", 1.0 * i, DBL_DECIMAL_DIG - 1,
        sind(i));
  }
  return 0;
}

此代码生成的结果比原始方法更准确,特别是对于多个角度的值,因为它在调用 trig 函数之前执行参数缩减。

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

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