首页 >后端开发 >C++ >为什么 C/C 的 `sin()` 和 `cos()` 函数在使用度数时会产生意外结果?

为什么 C/C 的 `sin()` 和 `cos()` 函数在使用度数时会产生意外结果?

DDD
DDD原创
2024-11-29 20:37:12173浏览

Why Do C/C  's `sin()` and `cos()` Functions Produce Unexpected Results When Using Degrees?

带度数输入的 sin 和 cos 函数的意外结果

使用 C/C sin() 和 cos() 函数计算角度时以度数表示时,度数与度数的数学解释可能会产生差异弧度。

差异原因

C/C 的 sin() 和 cos() 函数设计为接受以弧度表示的角度。然而,由于舍入和双精度数据类型的有限精度限制,随后使用 DegreesToRadians() 函数将角度转换为弧度会引入固有的近似值。此外,使用 M_PI 可能会导致与 π 的数学定义略有偏差。

数学解释

sin(0.0547) = 0.0547
cos(0.0547 )= 0.9984

以度表示时:

sin(0.0547) = sin(0.0547 × 180 / π) ≈ 0.0031
cos(0.0547) = cos(0.0547 × 180 / π) ≈ 0.9995

解决方案

要解决此差异,我们建议在调用三角函数之前减小角度(以度为单位)。该技术可确保 -45° 至 45° 范围内的精度。

#define M_PIf (3.14159265358979323846)
#include <stdio.h>

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

double sind(double x)
{
  if (x < 0.0)
  {
    return -sind(-x);
  }

  int quo;
  double x90 = remquo(fabs(x), 90.0, &amp;quo);
  switch (quo % 4)
  {
  case 0:
    return sin(DegreesToRadians(x90));
  case 1:
    return cos(DegreesToRadians(x90));
  case 2:
    return sin(DegreesToRadians(-x90));
  case 3:
    return -cos(DegreesToRadians(x90));
  }
}

样本输出

使用改进的 sind()函数:

printf("sin() of 180.0 degrees: %f\n", sin(DegreesToRadians(180.0)));
printf("sind() of 180.0 degrees: %f\n", sind(180.0));

输出

sin() of 180.0 degrees: -1.2246467991474805e-16
sind() of 180.0 degrees: -0.0000000000000000e+00

此输出演示了 sin() 和 cos() 函数的准确结果,角度以度为单位。

以上是为什么 C/C 的 `sin()` 和 `cos()` 函数在使用度数时会产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

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