0

倍精度数の間で大規模な (そしておそらく高速な) 比較を行う必要がある数値コードを作成しています。2 つの数値 A と B を比較する私の解決策は、A をイプシロンだけ左 (または右) にシフトし、結果が B よりも大きい (または小さい) かどうかを確認することです。そうであれば、2 つの double は同じです。(負の数またはゼロの数については、追加のコーディングを行う必要があります)。

これは比較関数です:

#define S_
inline double s_l (double x){
    if(x>0){return 0.999999999*x;}
    else if(x<0){return 1.00000001*x;}
    else {return x-0.000000000001;}
}
inline double s_r (double x){
    if(x>0){return 1.00000001*x;}
    else if(x<0){return 0.999999999*x;}
    else{return x+0.000000000001;}
}
inline bool s_equal (double x,double y){
    if(x==y){return true;}
    else if(x<y && s_r(x)>y){return true;}
    else if(x>y && s_l(x)<y){return true;}
    else{return false;}
}
#endif

これはモンテカルロ アルゴリズムの一部であり、s_equal(x,y) は何百万回も呼び出されるため、単純なレベルで理解できる、これをコーディングするためのより良い、またはより高速な方法があるかどうか疑問に思います。

4

3 に答える 3

0

私は abs( (xy)/x ) < 1.0e-10 のようなことをします。

両方の値が大きいか小さい場合は、x で割る必要があります。

于 2013-04-24T03:37:41.880 に答える
0

C++11 を使用している場合は、次のmathような新しいライブラリ関数を使用できます。

bool isgreater(float x, float y)

詳細なドキュメントstd::isgreaterこちらにあります。

それ以外の場合は、常にis_equalブーストがあります。また、SOには、ここここ、ここなどの関連する(同じかどうかわからない)質問がすでにたくさんあります

于 2013-04-24T03:18:03.220 に答える