resueltos punto programacion online numero numericos normalizado norma metodos mantisa flotante exponente ejercicios ejemplos c++ unit-testing catch-unit-test

c++ - programacion - ¿Cómo utilizar tolerancias de punto flotante en el marco de captura?



punto flotante metodos numericos (3)

Estoy usando el marco de prueba Catch .

En la publicación introductoria del blog, el autor menciona la siguiente característica:

  • Tolerancias de punto flotante soportadas de una manera fácil de usar

No pude encontrar ninguna documentación sobre cómo hacer esto. ¿Cómo se hace esto en Catch?


La tolerancia es personalizable desde abril de 2011 . Approx tiene dos funciones miembro para esto: epsilon() y scale() . Por ejemplo:

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

La tolerancia es ε × ( scale + max (| a |, | b |)), donde la escala por defecto es 1, por lo que esto pasará:

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


Sé que esta es una pregunta antigua, pero me topé con el mismo problema y encontré una solución simple. En el archivo de encabezado Catch.hpp donde se define la clase Approx (línea 2045 en el momento de la escritura), solo agregue el siguiente constructor:

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 ) {}

Ahora puedes hacer esto:

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)); }


Es sencillo. Existe una clase llamada Approx que le permite realizar esta prueba de una manera muy legible:

#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)); }

La tolerancia se puede cambiar utilizando las funciones miembro epsilon() y scale() del objeto Approx , de este modo: Approx(a).epsilon(e) .