Подтвердить что ты не робот

Как использовать допуски с плавающей точкой в ​​структуре Catch?

Я использую Catch тестовую структуру.

В вводном сообщении в блоге автор упоминает следующую функцию:

  • Допуски с плавающей точкой поддерживаются простым способом.

Я не мог найти документацию о том, как это сделать. Как это делается в Catch?

4b9b3361

Ответ 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));
}

Допуск можно изменить, используя функции-члены epsilon() и scale() объекта Approx, например: Approx(a).epsilon(e).

Ответ 2

Допуск был настроен с апреля 2011 года. Approx имеет две функции-члена для этого: epsilon() и scale(). Например:

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

Допуск равен ε × (шкала + max (| a |, | b |)), где масштаб по умолчанию равен 1, поэтому это будет проходить:

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

Ответ 3

Я знаю, что это старый вопрос, но я просто наткнулся на ту же проблему и нашел простое решение. В заголовочном файле Catch.hpp, где определен класс Approx (строка 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)); 
}