質問

そうです、私は本当に夢を生きていると思います。 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が私の「if」が入力されているので真であるように見えます!!!そして、私が「1」だと思うものの私のACOは、1が1より大きいのでNANQを返します。もう何を考えるべきかわからない!

コードは、「a」が1つであると思うものの価値を実際に取る他のアーキテクチャでは正常に機能します(a)は0です。

役に立ちましたか?

解決

結果とexpcedResultがフロートタイプである比較を行う場合:

if (result == expectedResult)

その後、比較が真実である可能性は低いです。比較が当てはまる場合、おそらく不安定です。入力値、コンパイラ、またはCPUの小さな変更が結果を変更し、比較を偽にする可能性があります。

Epsilonとの比較 - 絶対誤差

if (fabs(result - expectedResult) < 0.00001)

から 浮動小数点数の比較


すべてのコンピューター科学者が浮動小数点算術について知っておくべきこと

他のヒント

ビットを印刷します。小数の実数として、フロートの表示にある丸めエラーにだまされているだけかもしれません。

printf 指定された精度のない機能は、最初の6桁のみを表示します。したがって、より高い精度で印刷してみてください... Aは1よりわずかに大きいが、少しだけである可能性があります。 (a> 1)ではなく、物事をより堅牢にしたい場合は、(a-1)> epsilonを使用することができます。

1.0000000000000000001は1を超えています。そのチェックが合格している場合、私はあなたの問題が賭けます。

通常の解決策は、何らかの形のイプシロンを使用して、丸めエラーを心配するのを止めることです。つまり、あなたが二重にするべきだったら、やってみてください

if ( a > 1.00001f )

問題を引き起こさないように、おそらくそれに十分近い:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top