C/C++提供sin(a)
,cos(a)
,tan(a)
等需要與弧度單位而非度一個參數函數。 double DegreesToRadians(d)
執行的轉換是關閉,但轉換結果是四捨五入的近似值。此外,機器M_PI
已接近,但與數學非理性π
的值不同。
OP與180
代碼傳遞給DegreesToRadians(d)
然後sin()/cos()
給出不同比預期由於四捨五入的double()
有限精度和用於PI
可能弱值的結果。
一個改進是在調用trig函數之前在度中執行自變量減少。下面將角度先減小到-45°到45°範圍,然後再調用sin()
。這將確保sind(90.0*N) --> -1.0, 0.0, 1.0
的N
的較大值。 。注:sind(360.0*N +/- 30.0)
可能不完全等於+/-0.5
。需要一些額外的考慮。
#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;
}
輸出
sin() of -360.0 degrees is 2.4492935982947064e-16
sind() of -360.0 degrees is -0.0000000000000000e+00 // Exact
sin() of -345.0 degrees is 2.5881904510252068e-01 // 76-68 = 8 away
// 2.5881904510252076e-01
sind() of -345.0 degrees is 2.5881904510252074e-01 // 76-74 = 2 away
sin() of -330.0 degrees is 5.0000000000000044e-01 // 44 away
// 0.5 5.0000000000000000e-01
sind() of -330.0 degrees is 4.9999999999999994e-01 // 6 away
sin() of -315.0 degrees is 7.0710678118654768e-01 // 68-52 = 16 away
// square root 0.5 --> 7.0710678118654752e-01
sind() of -315.0 degrees is 7.0710678118654746e-01 // 52-46 = 6 away
sin() of -300.0 degrees is 8.6602540378443860e-01
sind() of -300.0 degrees is 8.6602540378443871e-01
sin() of -285.0 degrees is 9.6592582628906842e-01
sind() of -285.0 degrees is 9.6592582628906831e-01
sin() of -270.0 degrees is 1.0000000000000000e+00 // Exact
sind() of -270.0 degrees is 1.0000000000000000e+00 // Exact
...
'我知道它應該是:sin 0.0547,cos 0.99'更像「0和-1」。 – deviantfan
PI的正弦爲0,餘弦爲-1。這聽起來像是你得到的。 –
「0.0547的餘弦和0.99的餘弦」Huh?它應該完全是0和-1。你的代碼正確派生了(最多舍入錯誤)。 –