首页 >后端开发 >C++ >为什么 C/C 的 `sin()` 和 `cos()` 函数对于熟悉的角度不准确?

为什么 C/C 的 `sin()` 和 `cos()` 函数对于熟悉的角度不准确?

Patricia Arquette
Patricia Arquette原创
2024-12-05 14:26:10501浏览

Why Are C/C  's `sin()` and `cos()` Functions Inaccurate for Familiar Angles?

熟悉角度的 sin 和 cos 的意外结果

当使用 C/C 的 sin() 和 cos() 函数时180度的角度,用户可能会遇到意想不到的结果。期望值是:

  • sin of 0.0547
  • cos of 0.99

但是,获得的值经常偏离这些期望:

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

说明

C/C 的 sin() 和 cos() 函数操作以弧度作为输入参数,而不是度数。尽管 DegreesToRadians() 尝试将角度转换为弧度,但舍入不准确和有限的 double() 精度可能会导致结果出现差异。此外,机器常数 M_PI(数学常数 π 的估计)可能会导致这些偏差。

解决方案

要解决这些不准确问题,建议执行在调用三角函数之前以度为单位减少角度。这涉及在调用 sin() 之前将角度减小到 -45° 到 45° 的范围内。这可以确保在像 sin(90.0*N) 这样的计算中,大的 N 值会产生 -1.0、0.0 和 1.0 的准确结果。

提供了演示此方法的示例代码:

#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:
      return sin(d2r(x90));
    case 1:
      return cos(d2r(x90));
    case 2:
      return sin(d2r(-x90));
    case 3:
      return -cos(d2r(x90));
  }
  return 0.0;
}

此更新的代码可以为各种角度生成更准确的结果,如其输出所示:

sin()  of -90.0 degrees is   2.4492935982947064e-16
sind() of -90.0 degrees is  -0.0000000000000000e+00

sin()  of -120.0 degrees is   -7.0710678118654752e-01
sind() of -120.0 degrees is  -7.0710678118654746e-01

sin()  of -135.0 degrees is  -0.70710678118654757
sind() of -135.0 degrees is -0.70710678118654762

sin()  of -150.0 degrees is  -2.4492935982947064e-16
sind() of -150.0 degrees is  -0.0000000000000000e+00

sin()  of -180.0 degrees is   2.4492935982947064e-16
sind() of -180.0 degrees is  -0.0000000000000000e+00

以上是为什么 C/C 的 `sin()` 和 `cos()` 函数对于熟悉的角度不准确?的详细内容。更多信息请关注PHP中文网其他相关文章!

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