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

use*_*161 0 c math trigonometry distance

我正在使用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);
.....
Run Code Online (Sandbox Code Playgroud)

通过坐标后,每个"dist"变量值都在下面

Eclipse输出:

 0.006082
 1.000000
 0.000086
 0.004939
Run Code Online (Sandbox Code Playgroud)

微控制器输出:

0.006088 
1.000000
0.000345
0.019782     
Run Code Online (Sandbox Code Playgroud)

谢谢

Pot*_*ter 6

GNU库以及任何其他尝试符合浮点标准的库将返回零acos(1).实例.

最有可能的是,论证不是1,而是略小.acos(1 - FLT_EPSILON/2),在1之前传递最后一个单精度数,得出0.00034526哪个是你的结果.也许PIC作为一种功耗非常低的器件,不会实现双精度数学运算.acos在单精度算术中不可能有更小(但非零)的结果.

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