是的,我想我真的在实现梦想。我有以下代码,我在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> 1是正确的,因为我的“如果”已输入!!!我认为我认为“ 1”的ACO会返回NANQ,因为1大于1。我可以问一下这是怎么可能的吗?我不知道该怎么想!

该代码在“ a”真正使我认为是1的值的其他体系结构上正常工作,而ACO(a)为0。

有帮助吗?

解决方案

如果您进行比较,而结果和extctedResult是浮点类型:

if (result == expectedResult)

然后,比较不太可能是正确的。如果比较是正确的,则可能是不稳定的 - 输入值,编译器或CPU的微小变化可能会更改结果并使比较是错误的。

与Epsilon进行比较 - 绝对错误

if (fabs(result - expectedResult) < 0.00001)

比较浮点数


每个计算机科学家对浮点算术都应了解什么

其他提示

打印出碎片。在将浮子显示为十进制实数时,您可能会被一些舍入错误所愚弄。

printf 功能,没有指定的精度,只会向您显示前6位数字。因此,尝试以更高的精度打印……A可能略大于1,但只有一点。如果您想使事情变得更健壮,而不是(a> 1),则可以使用(A-1)> Epsilon来获得Epsilon的一定值。

1.00000000000000000000001大于1。您确定自己只看到足够的小数点吗?如果那张检查是通过,我会赌你的问题。

通常的解决方案是使用某种形式的Epsilon来阻止您担心四舍五入错误。即,如果您应该是双重的,请尝试做

if ( a > 1.00001f )

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top