如何在Catch框架中使用浮点公差
How to use floating point tolerances in the Catch framework?
我使用的是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));
}
可以使用Approx
对象的成员函数epsilon()
和scale()
来更改公差,如: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));
我知道这是一个老问题,但我只是偶然发现了同样的问题,并找到了一个简单的解决方案。在定义Approvx类的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));
}
需要注意的是,Approx
现在被认为是不推荐使用的[来源]:
Approvx的缺点是它有几个问题在不破坏向后兼容性的情况下无法修复。因为Catch2还提供了一套完整的匹配器,用于实现不同的考虑了浮点比较方法,近似值保持原样已弃用,不应在新代码中使用。
从2.10版本开始,应该切换到使用Matchers
。
#include <limits>
#include <catch2/matchers/catch_matchers_floating_point.hpp>
TEST_CASE("demo/matchers", "Matchers demo") {
double a = 1.0;
double b = a + std::numeric_limits<double>::epsilon();
REQUIRE_FALSE(b == a);
REQUIRE_THAT(b, Catch::Matchers::WithinRel(a, std::numeric_limits<double>::epsilon()));
}
相关文章:
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 为什么catch中的代码没有被执行
- catch框架有没有办法比较流或文件
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用Qt框架在c ++类中创建API调用
- 从 Rcpp Catch 测试中获取有关"inst/extdata"的数据
- 如何在ECS框架中更新组件数据和通知系统
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 用于C++的静态二进制检测或二进制重写工具和框架
- GoogleMock是否仍然打算与任何测试框架一起使用?
- 带有框架的 QGraphicsTextItem 的 QPropertyAnimation 会使文本抖动
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- "Catch"单元测试框架 - REQUIRE_THROWS_AS
- 使用CATCH C++单元测试框架测试两个std::向量是否相等
- 将头文件导入catch c++单元测试框架
- 如何在Catch框架中使用浮点公差
- catch单元测试框架是否支持junit风格的测试报告
- 使用Catch框架测试C++模板类
- Catch测试框架问题:不能使用Catch::Session()