對C/C 的cos 應用180 度的角度時()和sin() 函數,可能會出現不正確的結果。這可能會令人驚訝,因為我們預期結果為:
但是,實際結果通常有所不同:
這種差異源自於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中文網其他相關文章!