c++中的比较近似



在字典式地比较std::vector<double>向量时,是否有方法更改预定义<=<的精度?

我在代码中的许多地方对std::vector<double>矢量进行字典式比较,第一个分量(接近0(的比例与其他分量(在-700和700之间(的比例不同。我希望精度为1e-6,即对于两个分量ab,如果abs(a-b)<=1e-6,则我们考虑a=b,其中abdouble

由于我在代码中的许多地方使用了<=<,因此定义一个新函数来替换<=<来在向量之间进行比较是有风险的(我跳过了一些向量(,所以我想知道是否可以更改<=<的精度,以便此更改将直接应用于所有比较。

我有一个向量的例子:A=(-2.6666666666666936, 33497.435897435964, -300.51282051282101)B=(-2.6666666666666914, 17403.589743589808, -251.28205128205173),使用<=的结果是,由于第一个分量,A<=B,但在我的情况下,第一个分量等于(ε=1e-6(,所以A>B

没有好的方法可以更改运算符的精度。

我建议您编写自己的函数,对两个向量进行迭代并直接进行比较。类似于:

bool approxLessThan(
const std::vector<double>& a,
const std::vector<double>& b,
double tolerance) {
// feel free to handle this differently
assert(a.size() == b.size());
for (size_t i =0; i < a.size(); i++) {
double dif = a[i] - b[i];
if (std::abs(dif) > tolerance)
return dif < 0.0; // change this to <= as needed
}
return false; // The vectors are "equal"
}

如果需要,可以将其展开以处理不同大小的矢量。

最新更新