C - 每个 math.h 头文件的 "acos()" 是否不同?

C - Is "acos()" differ for each math.h header file?

我正在使用 PIC24F 系列微控制器之一计算两个纬度和经度坐标之间的距离。我在代码中包含了 PIC24F 的 "math.h" 头文件。问题是 acos(1) 给出了“0.000345”值,但我期待“0.000086”。我通过使用 Eclipse 的 math.h 头文件在 Eclipse 中使用的相同代码,它给出了正确的值“0.000086”。问题是什么?每个 math.h 头文件的 "acos()" 是否不同?

.....
theta = lon1 - lon2;
printf("%f",theta);
dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2)) + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta));
printf("%f", dist);
dist = acos(dist);
printf("%f", dist);
dist = rad2deg(dist);
printf("%f", dist);
.....

通过坐标后,每个"dist"变量值如下

日食输出:

 0.006082
 1.000000
 0.000086
 0.004939

微控制器输出:

0.006088 
1.000000
0.000345
0.019782     

谢谢

问题是三角函数。精确算法要么非常慢要么非常大,快速算法要么非常大要么非常不精确,而小算法要么非常慢要么非常不精确。大型系统可以通过大型实现来解决问题,但嵌入式系统由于其资源较少和速度较慢,通常不得不凑合使用不太精确的结果。

GNU 库,以及任何其他尝试符合浮点标准的库,将 return acos(1) 归零。 Live example.

自变量很可能不完全是 1,而是略小一些。 acos(1 - FLT_EPSILON/2),传递 1 之前的最后一个单精度数字,得到 0.00034526,这就是您的结果。 PIC 可能是一种功耗非常低的设备,不会实现双精度数学运算。在单精度算术中不可能有更小的(但非零)acos 结果。

除此之外,作为计算错误来源的浮点结果的舍入可能因平台而异。