【问题标题】:Error with EXPECT_EQ for sum of double or float对于 double 或 float 的总和,EXPECT_EQ 出错
【发布时间】:2013-02-28 05:59:16
【问题描述】:

我无法理解为什么在对双数或浮点数求和的情况下测试用例会失败。它适用于整数数据类型。

//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

【问题讨论】:

    标签: c++ unit-testing floating-point googletest


    【解决方案1】:

    改用EXPECT_NEARDoubleEq 匹配器。浮点运算可能导致rounding errors,这使得结果略有不同。

    【讨论】:

    【解决方案2】:

    请参阅Floating Point Comparison 的文档

    EXPECT_EQ 使用完全匹配。 但是你不能完全匹配两个浮点数。 (至少很轻松。)

    您可以使用EXPECT_FLOAT_EQEXPECT_DOUBLE_EQ。 (具有启发式边界) 此外,您可以使用具有特定界限的EXPECT_NEAR

    【讨论】:

      【解决方案3】:

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

      比较浮点值时,检查是否相等可能会导致 到意想不到的结果。舍入错误可能导致结果为 接近预期,但不相等。结果,一个 检查两个浮点数是否相等时,断言可能会失败 即使程序执行正确,数量也是如此。

      谷歌 C++ 测试框架提供了比较两个浮点数的函数 数量达到给定的精度。

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

      【讨论】:

      • 我不喜欢 EXPECT_DOUBLE_EQ() 的一点是你不能提供错误增量。有时由于浮点错误,尤其是累积错误,测试仍然会失败。
      【解决方案4】:

      这只是 Googletest 中的一个错误。文本输出应该证明失败,但它的格式没有准确指定。

      【讨论】:

      • 这不是 gtest 中的错误,而是浮点表示中数字的属性。这是一个参考docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
      • 我相信发帖者是在说文本输出没有足够的小数位来显示两者不匹配是一个错误。不是数字应该匹配。
      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多