首頁 >後端開發 >C++ >為什麼 C/C 的 `sin()` 和 `cos()` 函數在使用度數時會產生意外結果?

為什麼 C/C 的 `sin()` 和 `cos()` 函數在使用度數時會產生意外結果?

DDD
DDD原創
2024-11-29 20:37:12180瀏覽

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() 和cos()函數的準確結果,角度以度為單位。
sin() of 180.0 degrees: -1.2246467991474805e-16
sind() of 180.0 degrees: -0.0000000000000000e+00

以上是為什麼 C/C 的 `sin()` 和 `cos()` 函數在使用度數時會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn