熟悉角度的 sin 和 cos 的意外结果
当使用 C/C 的 sin() 和 cos() 函数时180度的角度,用户可能会遇到意想不到的结果。期望值是:
但是,获得的值经常偏离这些期望:
说明
C/C 的 sin() 和 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中文网其他相关文章!