【问题标题】:How to use floating point tolerances in the Catch framework?如何在 Catch 框架中使用浮点容差?
【发布时间】:2011-10-06 19:05:57
【问题描述】:

我正在使用Catch 测试框架。

作者在introductory blog post 中提到了以下功能:

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

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

【问题讨论】:

    标签: c++ unit-testing catch-unit-test


    【解决方案1】:

    这很简单。有一个名为 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)

    【讨论】:

    • 如果您要投反对票,请解释原因。对我来说,这看起来不错。
    • @Martin 那是人们会在评论中写的东西,而不是在编辑中。
    • @Martin 没问题;你让我知道了我错过的另一个答案。谢谢。
    【解决方案2】:

    公差是可定制的since Apr 2011Approx 有两个成员函数:epsilon()scale()。例如:

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

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

    REQUIRE((2+2) == Approx(5).epsilon(0.17));
    

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题,但我偶然发现了同样的问题并找到了一个简单的解决方案。在定义 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)); 
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        相关资源
        最近更新 更多