我正在使用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”变量值都低于
Eclipse输出:
0.006082
1.000000
0.000086
0.004939
微控制器输出:
0.006088
1.000000
0.000345
0.019782
由于
答案 0 :(得分:6)
GNU库以及任何其他尝试符合浮点标准的库将为acos(1)
返回零。 Live example
最有可能的是,论证不是1,而是略小。 acos(1 - FLT_EPSILON/2)
,在1之前传递最后一个单精度数,产生0.00034526
,这是你的结果。也许PIC作为一种功耗非常低的器件,不会实现双精度数学运算。在单精度算术中不可能有更小(但非零)acos
的结果。
除此之外,作为计算错误来源的浮点结果的舍入可能因平台而异。
答案 1 :(得分:2)
问题是三角法是 hard 。精确算法要么非常慢,要么非常大,快速算法要么非常大要么非常不精确,而小算法要么非常慢,要么非常不精确。大型系统可以摆脱大型实施,但嵌入式系统虽然资源较少,速度较慢,但通常不得不采用不太精确的结果。