Error con EXPECT_EQ para suma de doble o flotante

3 minutos de lectura

avatar de usuario de suma
suma

No puedo entender por qué falló el caso de prueba en caso de sumar números dobles o flotantes. Funciona muy bien para el tipo de datos enteros.

//el método en simple_method.h

double sum ( double a, double b)
{
    double res = a+b;
    return res;
}

// el caso de prueba para este método

TEST(simpleSum, sumOfFloat)
{
    EXPECT_EQ(4.56, sum(0.56, 4.0));
}

// la salida es

Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from simpleSum
[ RUN      ] simpleSum.sumOfFloat
/home/pcadmin/Desktop/so/so3/simple_method_test.cpp:7: Failure
Value of: sum(0.56, 4.0)
  Actual: 4.56
Expected: 4.56
[  FAILED  ] simpleSum.sumOfFloat (0 ms)
[----------] 1 test from simpleSum (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] simpleSum.sumOfFloat

 1 FAILED TEST

avatar de usuario de congusbongus
congusbongo

Usar EXPECT_NEAR o el DoubleEq emparejador en su lugar. Las operaciones de coma flotante pueden dar lugar a errores de redondeo, lo que hace que los resultados sean ligeramente diferentes.

  • EXPECT_NEAR tiene un enlace roto. Pude encontrar esta parte de la documentación en su lugar: github.com/google/googletest/blob/master/googletest/docs/…

    – kyriakosSt

    10 oct 2018 a las 15:11

  • Me abstuve porque no sabía si podrías hacer funcionar el enlace original.

    – kyriakosSt

    11 de octubre de 2018 a las 9:07

  • Solo para mi EXPECT_NEAR trabajó. Incluso cuando la diferencia era menor que 10^(-5) “EXPECT_DOUBLE_EQ` falló

    – joepol

    15 de marzo de 2020 a las 12:44


Avatar de usuario de Jinuk Kim
jinuk kim

Consulte la documentación para Comparación de punto flotante

EXPECT_EQ utiliza coincidencia exacta. Pero no puedes hacer coincidir exactamente dos números flotantes. (al menos con facilidad).

Puedes usar EXPECT_FLOAT_EQ o EXPECT_DOUBLE_EQ. (con límites heurísticos) Además, puede usar EXPECT_NEAR con límites específicos.

De https://testing.googleblog.com/2008/10/tott-floating-point-comparison.html

Al comparar valores de coma flotante, la comprobación de la igualdad puede generar resultados inesperados. Los errores de redondeo pueden llevar a un resultado cercano al esperado, pero no igual. Como consecuencia, una aserción puede fallar al verificar la igualdad de dos cantidades de punto flotante incluso si el programa se implementa correctamente.

El marco de prueba de Google C++ proporciona funciones para comparar dos cantidades de punto flotante hasta una precisión dada.

ASSERT_FLOAT_EQ(expected, actual);
ASSERT_DOUBLE_EQ(expected, actual);

EXPECT_FLOAT_EQ(expected, actual);
EXPECT_DOUBLE_EQ(expected, actual);

En tu caso,

TEST(simpleSum, sumOfFloat)
{
    EXPECT_DOUBLE_EQ(4.56, sum(0.56, 4.0));
}

  • lo que no me gusta de EXPECT_DOUBLE_EQ() es que no puede proporcionar un error delta. A veces, una prueba aún fallará debido a un error de punto flotante, especialmente un error acumulado.

    – voxoide

    10 de julio de 2020 a las 17:39

  • “El marco de prueba de Google C ++ proporciona funciones para comparar dos cantidades de punto flotante hasta una precisión dada”. ¿Hay algún documento para la precisión?

    – Fan de Ziqi

    16 de julio a las 1:16

Esto es solo un error en Googletest. La salida de texto debería probar la falla, pero el formato no se especifica con precisión.

¿Ha sido útil esta solución?