熟悉角度的sin 和cos 的意外結果
使用C/C 的sin() 和cos() 函數時180度的角度,使用者可能會遇到意想不到的結果。期望值為:
但是,所得的值常偏離這些期望值:
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中文網其他相關文章!