平等检查双倍:我的测试的效率和质量

时间:2014-07-25 09:40:40

标签: c++ algorithm equality

我写了这段代码,让我可以检查两个双打几乎相等的时间:

bool are_equal(double x, double y, double abs_tol=1e-15, double rel_tol=1e-15){ 
    double diff(std::abs(x-y));
    x = std::abs(x);
    y = std::abs(y);
    x = (x>y)?x:y;
    return (diff<rel_tol*x) || (diff<abs_tol);  /*has been updated*/
}

我想知道它是否是一个安全的测试,什么是&#34; smart&#34; abs_tolrel_tol的值。我想修复这些值,以便适用于非常小且非常大的双倍。

修改 这是link我的灵感来源于......

1 个答案:

答案 0 :(得分:1)

这是不必要的低效率。

你不需要更大的abs(x),abs(y);选择其中一个会很好。

x和y非常接近(几乎相等),那么你是否与abs(x)或abs(y)相比并不重要。或者它们并不紧密,然后差异很大,无论你是否与abs(x)或abs(y)进行比较都无关紧要。

最后不要使用三元运算符,只需编写

即可
return (diff < del_tol * x) && (diff < abs_tol);

现在,首先进行第二次检查显然更有效,因为它不需要任何额外的计算。

double diff = std::abs (x - y);
return (diff < abs_tol) && (diff < del_tol * std::abs (x)); 

但最后整个比较方法看起来非常可疑。如果你的数字只是略大,那么差异&lt; abs_tol意味着x和y必须相等,所以整个代码只是一个荒谬复杂的检查。