倍精度数の間で大規模な (そしておそらく高速な) 比較を行う必要がある数値コードを作成しています。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) は何百万回も呼び出されるため、単純なレベルで理解できる、これをコーディングするためのより良い、またはより高速な方法があるかどうか疑問に思います。