是的,我想我真的在做一个梦。我有以下代码段,这些代码可以在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”的余地会返回NanQ,因为1大于1。请问这怎么可能?我不知道该怎么想了!

该代码在其他架构上都可以正常工作,其中“ a”实际上采用我认为为1的值,而acos(a)为0。

最佳答案

如果进行比较,其中result和expctedResult是浮点类型:


if (result == expectedResult)



因此,比较不可能是正确的。如果比较正确,则可能不稳定-输入值,编译器或CPU的微小变化可能会改变结果并使比较结果为假。


与epsilon比较–绝对错误

if (fabs(result - expectedResult) < 0.00001)


来自Comparing floating point numbers



What Every Computer Scientist Should Know About Floating-Point Arithmetic

关于c - 什么时候是真的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2743718/

10-09 15:51