我写了这段代码,让我可以检查两个双打几乎相等的时间:
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_tol
和rel_tol
的值。我想修复这些值,以便适用于非常小且非常大的双倍。
修改 这是link我的灵感来源于......
答案 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必须相等,所以整个代码只是一个荒谬复杂的检查。