什么时候是>是真的?

时间:2010-04-30 10:05:56

标签: c aix xlc

是的,我想我真的是一个梦想。我有以下代码,我在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机器上,它看起来像1&gt;输入我的'if'时,1为真!而我认为'1'的结果是返回NanQ,因为1大于1.请问这是怎么回事?我不知道该怎么想了!

代码在其他架构上运行得很好,其中'a'实际上取值为1,而acos(a)为0。

4 个答案:

答案 0 :(得分:8)

  

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

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

答案 1 :(得分:4)

打印出这些位。你可能只是被浮动显示中的一些舍入错误作为十进制实数而被愚弄。

答案 2 :(得分:4)

printf函数没有指定的精度,只会显示前6位数字。因此,尝试以更高的精度打印...... a可能略大于1,但只有一点点。如果你想使事情变得更强大,而不是(a> 1),你可以使用(a-1)&gt; epsilon来获得某些epsilon值。

答案 3 :(得分:1)

1.000000000000000000001大于1.您确定您没有看到足够的小数位吗?如果那张支票正在通过,我会打赌这是你的问题。

通常的解决方案是使用某种形式的epsilon来阻止你担心舍入错误。也就是说,如果您应该使用双倍,那么尝试

if ( a > 1.00001f )

它可能足够接近一个,以免引起你的问题:)