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

Ошибка с EXPECT_EQ для суммы double или float

Я не могу понять, почему тестовый пример завершился неудачей в случае суммирования двойных чисел или поплавков. Он работает очень точно для целочисленного типа данных.

//метод в simple_method.h

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

//тестовый пример для этого метода

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

//вывод

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
4b9b3361

Ответ 2

См. документацию по Сравнению с плавающей точкой

EXPECT_EQ использует точное совпадение. Но вы не можете точно сопоставить два плавающих числа. (по крайней мере, с легкостью.)

Вы можете использовать EXPECT_FLOAT_EQ или EXPECT_DOUBLE_EQ. (с эвристическими границами) Также вы можете использовать EXPECT_NEAR с конкретными границами.

Ответ 3

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

При сравнении значений с плавающей точкой проверка на равенство может привести до неожиданных результатов. Ошибки округления могут привести к результату, который близок к ожидаемому, но не равен. Как следствие, утверждение может потерпеть неудачу при проверке на равенство двух чисел с плавающей точкой количества, даже если программа реализована правильно.

Google C++ Testing Framework предоставляет функции для сравнения двух чисел с плавающей точкой количества до заданной точности.

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

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

В твоем случае,

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

Ответ 4

Это просто ошибка в Googletest. Текстовый вывод должен доказать сбой, но формат его точно не указан.