我正在使用Catch测试框架。
在介绍性博客文章中,作者提到了以下功能:
- 以易于使用的方式支持浮点公差
我找不到任何有关如何执行此操作的文档。这是如何在 Catch 中完成的?
这很简单。有一个名为的类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 年 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));
我知道这是一个老问题,但我偶然发现了同样的问题并找到了一个简单的解决方案。在定义 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));
}