29

我正在使用Catch测试框架。

介绍性博客文章中,作者提到了以下功能:

  • 以易于使用的方式支持浮点公差

我找不到任何有关如何执行此操作的文档。这是如何在 Catch 中完成的?

4

3 回答 3

35

这很简单。有一个名为的类Approx可以让您以非常易读的方式进行此测试:

#include <limits>
TEST_CASE("demo/approx", "Approx demo") {
    double a = 1.0;
    double b = a + std::numeric_limits<double>::epsilon();
    REQUIRE_FALSE(b == a);
    REQUIRE(b == Approx(a));
}

可以通过使用成员函数epsilon()和对象scale()的来更改容差Approx,如下所示:Approx(a).epsilon(e).

于 2011-07-16T15:28:09.547 回答
15

自 2011 年 4 月起,公差已可定制。Approx为此有两个成员函数:epsilon()scale(). 例如:

REQUIRE(a == Approx(b).epsilon(my_eps));

容差为 ε × ( scale +max(| a |, | b |)),其中 scale 默认为 1,因此将通过:

REQUIRE((2+2) == Approx(5).epsilon(0.17));
于 2014-04-06T19:05:47.663 回答
2

我知道这是一个老问题,但我偶然发现了同样的问题并找到了一个简单的解决方案。在定义 Approx 类的 Catch.hpp 头文件中(撰写本文时的第 2045 行),只需添加以下构造函数:

class Approx {
public:
    explicit Approx( double value )
    :   m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
        m_scale( 1.0 ),
        m_value( value )
    {}

    explicit Approx( double value, double epsilon ) // <- New constructor
    :   m_epsilon( epsilon ),
        m_scale( 1.0 ),
        m_value( value )
    {}

现在你可以这样做:

TEST_CASE("demo/approx", "Approx demo") {
    double myTol = 0.1;
    double a = 1.0;
    double b = a + myTol;
    REQUIRE_FALSE(a == b);
    REQUIRE(a == Approx(b, myTol)); 
}
于 2014-01-05T00:08:53.320 回答