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
结果。
除此之外,作为计算错误来源的浮点结果的舍入可能因平台而异。
我正在使用 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
结果。
除此之外,作为计算错误来源的浮点结果的舍入可能因平台而异。