正弦和余弦函数对于已知角度产生意外结果
问题:
使用时C/C 的 cos() 和 sin() 函数,角度为180度,得到的结果与预期值有较大偏差,如sin(0.0547)和cos(0.99)。相反,这些函数返回 sin(3.5897934739308216e-009) 和 cos(-1.00000)。
有问题的代码:
double radians = DegreesToRadians(angle); double cosValue = cos(radians); double sinValue = sin(radians);
DegreesToRadians() 转换度数的位置使用弧度公式:
double DegreesToRadians(double degrees) { return degrees * PI / 180; }
解释:
C/C 的三角函数(sin()、cos()、tan() 等)需要其以弧度而不是角度输入。代码中提供的 DegreesToRadians() 函数使用 PI 作为常数,提供度数到弧度的近似转换。然而,近似值会引入舍入误差,并且 M_PI 的使用可能无法与 π 的数学值精确对齐。
此外,将转换后的弧度直接传递给 sin() 和 cos() 函数可以进一步放大这些值错误,导致某些结果不正确
解决方案:
要解决此问题,可以在调用三角函数之前执行角度减小。该技术将角度减小到 -45° 到 45° 之间的范围,解决舍入误差问题。例如,考虑下面的 sind() 函数:
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; }
该函数封装了角度缩减逻辑,并确保各种角度(包括 180 度)的结果更准确。
以上是为什么 C/C 的 `sin()` 和 `cos()` 函数对于 180 度等已知角度会产生意想不到的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!