【发布时间】:2013-04-23 23:21:53
【问题描述】:
我正在编写一个数字代码,它需要在双精度数字之间进行广泛(并且可能是快速)比较。我比较两个数字 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
由于这是 MonteCarlo 算法的一部分,并且 s_equal(x,y) 被调用了数百万次,我想知道是否有更好或更快的编码方式,可以简单理解。
【问题讨论】:
-
我做了类似 abs( (x-y)/x )
-
“几乎相等”是一种先进的技术,不应轻易采取。例如,如果
a几乎等于b并且b几乎等于c,则并不意味着a几乎等于c。这可能会导致意想不到的并发症。 -
@brianbeuning 考虑将其发布为答案。这是一个非常与所提出的算法非常接近的匹配,并且通过删除所有 if 分支,它应该比所提出的要快得多。
标签: c++ compare double floating