我在寫一個數字代碼,需要在雙精度數字之間進行廣泛的(也可能是快速的)比較。我比較兩個數字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