gpt4 book ai didi

c++ - double : efficency and quality of my test 的相等性检查

转载 作者:太空狗 更新时间:2023-10-29 23:03:38 26 4
gpt4 key购买 nike

我编写的这段代码允许我检查两个 double 何时几乎相等:

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*/
}

我想知道这是否是一个安全的测试,abs_tolrel_tol 的“智能”值是多少。我想修复这些值,以便它适用于非常小和非常大的 double 值。

编辑这是 link我的灵感来自……

最佳答案

这是不必要的低效。

你不需要 abs (x), abs (y) 中的较大者;选择其中一个就可以了。

要么x和y靠得很近(几乎相等),那么无论你是用abs(x)还是abs(y)来比较都无所谓。或者不是靠的很近,那么diff就大了,跟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));

但最后整个比较方法看起来很可疑。如果你的数字只是稍微大一点,那么 diff < abs_tol 将暗示 x 和 y 必须相等,所以整个代码只是一个荒谬复杂的相等性检查。

关于c++ - double : efficency and quality of my test 的相等性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24952637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com