我正在编写一个数字代码,需要在双精度数字之间进行广泛(可能是快速)比较。我比较两个数字 A 和 B 的解决方案包括将 A 向左(或向右)移动一个 epsilon 并检查结果是否大于(或小于)B。如果是,则两个双精度数相同。(需要对负数或零数进行额外编码)。
这是比较函数:
#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) 被调用了数百万次,我想知道是否有更好或更快的方法来编写这个代码,在简单的层面上是可以理解的。