我在写一个数字代码,需要在双精度数字之间进行广泛的(也可能是快速的)比较。我比较两个数字A和B的解决方案包括将A移到左边(或右边),并检查结果是否比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)的部分被称为数百万次,我不知道是否有任何更好或更快地码这在简单的层面上是可以理解的。
我喜欢abs((x-y)/ x)<1.0e-10 – 2013-04-23 23:33:21
“几乎相等”是一种先进的技术,不应该轻易进行。例如,如果'a'几乎等于'b'且'b'几乎等于'c',那么'a'几乎等于'c'。这可能会导致意想不到的并发症。 – 2013-04-24 00:39:44
@brianbeuning考虑发布这个答案。它与所提出的算法非常接近匹配,并且通过消除所有分支,它应该比所呈现的快得多。 – 2013-04-24 03:30:40