C a>;真的吗?

C a>;真的吗?,c,aix,xlc,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

对,我想我真的活在梦想中。我在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;
}
aix35 PowerPC_POWER5处理器类型 IBM XL C/C++for AIX,V10.1 版本:10.01.0000.0003 #包括 #包括 #定义弧度(x)((x)*acos(0.0)/90.0) 双最近距离(双半径、双lon1、双lat1、双lon2、双lat2){ 双rlat1=弧度(lat1); 双rlat2=弧度(lat2); 双rlon1=lon1; 双rlon2=lon2; 双a=0,b=0,c=0; a=sin(rlat1)*sin(rlat2)+cos(rlat1)*cos(rlat2)*cos(rlon2-rlon1); printf(“%lf\n”,a); 如果(a>1){ printf(“aaaaaaaaaaaaaa\n”); } b=acos(a); c=半径*b; 返回半径*(acos(sin(rlat1)*sin(rlat2)+ cos(rlat1)*cos(rlat2)*cos(rlon2-rlon1)); } int main(int argc,字符**argv){ 最近距离(6367.47,10,64,10,64); 返回0; } 现在,计算后的“a”值报告为“1”。而且,在这台AIX机器上,当输入我的“if”时,1>1看起来是真的!!!我认为“1”的ACO返回NanQ,因为1大于1。请问这怎么可能?我不知道该怎么想了


该代码在其他体系结构上运行良好,其中“a”的值实际上是1,acos(a)是0。

打印出位。您可能只是被浮点数显示为十进制实数时的舍入错误所愚弄。

1.000000000000001大于1。你确定你看不到足够的小数点吗?如果那张支票通过了,我打赌那是你的问题

通常的解决方法是使用某种形式的ε来停止担心舍入误差。(如果你的替身应该是替身,那就试试吧。)

if ( a > 1.00001f )
它可能非常接近1,以免给您带来问题:)

该函数在没有指定精度的情况下,只会显示前6位数字。所以,尝试以更高的精度打印。。。a可能略大于1,但只比1大一点点。如果您想让事情变得更健壮,而不是(a>1),可以使用(a-1)>epsilon来表示epsilon的某个值

如果在result和expctedResult为浮点类型的情况下进行比较:

那么,这种比较不太可能是真的。如果比较是真的,那么它可能是不稳定的——输入值、编译器或CPU中的微小更改可能会改变结果并使比较为假

与epsilon比较–绝对误差

if (fabs(result - expectedResult) < 0.00001)
if(fabs(结果-预期结果)<0.00001)



我宁愿使用弧度(x)((x)*M_PI)/2),您正在调用函数,这是不必要的,而且速度较慢。要回答您的问题,
a
永远不应该是真的,但如果a看起来像1,您可能仍然有
a>1
,因此您需要修正您的问题,因为标题具有误导性,你并不是在拿a和它自己做比较。你说得很好,谢谢!当代码在不同的体系结构/编译器上工作时,我感到困惑。在AIX上,“a”的值类似于“1.00000000000000022204”。我想我现在必须实现epsilon比较。
if (fabs(result - expectedResult) < 0.00001)