对 C/C 的 cos 应用 180 度的角度时() 和 sin() 函数,可能会出现不正确的结果。这可能会令人惊讶,因为我们预计结果为:
但是,实际结果通常有所不同:
这种差异源于 C/C 中 cos(a)、sin(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中文网其他相关文章!