3

我正在使用Catch单元测试框架,我想比较一个双精度向量。这个另一个答案建议使用 Approx 来比较浮点/双精度值,但这不适用于它们的向量。有什么方便的方法可以做到这一点吗?

编辑:一个例子

使用以下代码:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

TEST_CASE("Compare Vectors", "[vector]") {
    std::vector<int> vec1 = {0, 1, 2, 3};
    std::vector<int> vec2 = {0, 1, 2, 4};
    REQUIRE(vec1 == vec2);
}

测试失败,报告如下:

-------------------------------------------------------------------------------
Compare Vectors
-------------------------------------------------------------------------------
test/UnitTests/test_Example/example.cc:4
...............................................................................

test/UnitTests/test_Example/example.cc:7: FAILED:
  REQUIRE( vec1 == vec2 )
with expansion:
  { 0, 1, 2, 3 } == { 0, 1, 2, 4 }

===============================================================================
test cases: 1 | 1 failed
assertions: 1 | 1 failed

但是,如果我按如下方式更改代码,我希望测试通过,但显然没有。

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

TEST_CASE("Compare Vectors", "[vector]") {
    std::vector<double> vec1 = {0, 1, 2, 3};
    std::vector<double> vec2 = {0, 1, 2, 3.000001};
    REQUIRE(vec1 == vec2);
}

我可以遍历元素并逐一比较它们,但如果出现差异,则更难以确定错误的来源。

4

2 回答 2

3

尽管从Catch 2.7.2到现在已经过去了 4 年,用户现在可以使用以下方法比较向量Approx

REQUIRE_THAT(vec1, Catch::Approx(vec2).margin(0.0001);

这将在误差±0.0001 范围内比较两个向量。更多细节在这里

于 2021-06-17T22:10:38.420 回答
2

暂时我已经采取了一种解决方法。我创建了以下两个函数,可在您要检查两个向量的任何地方使用。(即REQUIRE(compareVectors(vec1, vec2));

bool compareVectors(std::vector<double> a, std::vector<double> b) {
    if (a.size() != b.size()) return false;
    for (size_t i = 0; i < a.size(); i++) {
        if (a[i] != Approx(b[i])) {
            std::cout << a[i] << " Should == " << b[i] << std::endl;
            return false;
        }
    }
    return true;
}

bool compare2dVectors(std::vector<std::vector<double>> a,
                      std::vector<std::vector<double>> b) {
    if (a.size() != b.size()) return false;
    for (size_t i = 0; i < a.size(); i++) {
        if (! compareVectors(a[i], b[i])) return false;
    }
    return true;
}

这样,您至少可以看到失败的向量的名称,以及不同的第一个值。

这不是理想的解决方案,所以我仍然希望有人能够想出更好的东西,但我想我至少会分享到目前为止我想出的东西,以防它对某人有所帮助。

于 2017-02-03T17:15:45.760 回答