首頁  >  文章  >  後端開發  >  為什麼 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 中(cosa(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