Как использовать допуски с плавающей точкой в ​​платформе Catch? - PullRequest
26 голосов
/ 16 июля 2011

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

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

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

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

Ответы [ 3 ]

30 голосов
/ 16 июля 2011

Все просто. Существует класс с именем 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).

14 голосов
/ 06 апреля 2014

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

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

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

REQUIRE((2+2) == Approx(5).epsilon(0.17));
2 голосов
/ 05 января 2014

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