检查两个向量是否相等

时间:2016-02-08 10:21:49

标签: c++ vector cpputest

我有两个向量:

std::vector<double> calculatedValues = calculateValues();
std::vector<double> expectedValues = {1.1, 1.2};

我正在使用 cpputest 来验证这些向量是否相等:

CHECK_TRUE(calculatedValues == expectedValues)

这很有效。但是,我想知道我是否应该使用一些容忍度,因为毕竟我正在比较双打

3 个答案:

答案 0 :(得分:2)

要比较浮点值,您应该执行以下操作:

bool is_equal(double a, double b) {

    return (abs(a-b)/b < 0.0001); // 0.00001 value can be a relative value
}

您可以对其进行调整以比较您的向量。

答案 1 :(得分:1)

是的,您应该使用一些容差,因为不保证浮点运算在不同的CPU上产生完全相同的结果。可以有例如舍入错误。

但是,SSE / SSE2标准确实提供了可重现的浮点数学运算,因此您可以考虑使用编译标志/ ARCH:SSE2作为替代方案。也就是说,很难确保在应用程序的任何地方都不使用x87数学,所以要小心!

答案 2 :(得分:1)

而不是operator==您可以将std::equal()与自定义 epsilon 一起使用:

bool equal = std::equal(calculatedValues.begin(), calculatedValues.end(), expectedValues.begin(),
                        [](double value1, double value2)
                        {
                            constexpr double epsilon = 0.01; // Choose whatever you need here
                            return std::fabs(value1 - value2) < epsilon;
                        });
CHECK_TRUE(equal);