是的,我想我真的是在做梦。我在 AIX 机器上编译并运行了以下代码:
AIX 3 5
PowerPC_POWER5 processor type
IBM XL C/C++ for AIX, V10.1
Version: 10.01.0000.0003
#include <stdio.h>
#include <math.h>
#define RADIAN(x) ((x) * acos(0.0) / 90.0)
double nearest_distance(double radius,double lon1, double lat1, double lon2, double lat2){
double rlat1=RADIAN(lat1);
double rlat2=RADIAN(lat2);
double rlon1=lon1;
double rlon2=lon2;
double a=0,b=0,c=0;
a = sin(rlat1)*sin(rlat2)+ cos(rlat1)*cos(rlat2)*cos(rlon2-rlon1);
printf("%lf\n",a);
if (a > 1) {
printf("aaaaaaaaaaaaaaaa\n");
}
b = acos(a);
c = radius * b;
return radius*(acos(sin(rlat1)*sin(rlat2)+
cos(rlat1)*cos(rlat2)*cos(rlon2-rlon1)));
}
int main(int argc, char** argv) {
nearest_distance(6367.47,10,64,10,64);
return 0;
}
现在,计算后“a”的值报告为“1”。而且,在这台 AIX 机器上,当我输入“if”时,看起来 1 > 1 为真!我认为“1”的 acos 返回 NanQ,因为 1 大于 1。请问这怎么可能?我不知道该怎么想了!
该代码在其他架构上运行得很好,其中“a”实际上取的是我认为的 1 的值,而 acos(a) 是 0。
如果您进行比较,其中 result 和 expctedResult 是 float 类型:
if (result == expectedResult)
那么这种比较不太可能是正确的。如果比较为真,那么它可能不稳定 - 输入值、编译器或 CPU 的微小变化可能会改变结果并使比较为假。
与 epsilon 比较 – 绝对误差
if (fabs(result - expectedResult) < 0.00001)
From 比较浮点数
每个计算机科学家都应该了解的浮点运算知识
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)