首頁 >後端開發 >C++ >為什麼 C/C 的 `sin()` 和 `cos()` 函數對於熟悉的角度不準確?

為什麼 C/C 的 `sin()` 和 `cos()` 函數對於熟悉的角度不準確?

Patricia Arquette
Patricia Arquette原創
2024-12-05 14:26:10500瀏覽

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

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