2011-07-16 8 views

Respuesta

23

Es simple. Hay una clase llamada Approx que le permite hacer esta prueba de una manera muy fácil de leer:

#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 mediante el uso de las funciones miembro epsilon() y scale() del objeto Approx, así: Approx(a).epsilon(e).

+4

Si va a votar abajo, explique por qué. Para mí esto se ve bien. –

+1

Metadata relacionada: http://meta.stackexchange.com/questions/98766/is-it-ok-to-post-a-question-and-self-answer-it-within-1-minute –

+0

@Martin que era el tipo de cosa que uno escribiría en un comentario, no en una edición. –

1

Sé que esta es una vieja pregunta, pero me encontré con el mismo problema y encontré una solución simple. En el archivo de cabecera Catch.hpp donde se define la clase Aprox (línea 2045 en el momento de la escritura), sólo tiene que añadir 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 usted puede 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)); 
} 
11

El la tolerancia ha sido personalizable since Apr 2011. Approx tiene dos funciones de miembro para esto: epsilon() y scale(). Por ejemplo:

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

La tolerancia es ε × (escala + max (| un |, | b |)), donde los valores predeterminados escala a 1, por lo que este pasará:

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