使用 EXPECT_EQ 计算 double 或 float 的总和出现错误

41
我无法理解为什么在对双精度数或浮点数求和的测试用例中失败了。它对于整数数据类型非常好用。
//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
4个回答

57

"EXPECT_NEAR" 的链接已经失效。我找到了文档的这一部分:https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#floating-point-macros - kyriakosSt
我没有采取行动,因为我不确定你是否能够使原始链接正常工作。 - kyriakosSt
对我来说,只有EXPECT_NEAR起作用。即使差异小于10^(-5)EXPECT_DOUBLE_EQ也会失败。 - joepol

39

6

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

在比较浮点数值时,检查相等可能会导致意外的结果。舍入误差可能会导致结果接近预期结果但并不相等。因此,即使程序实现正确,检查两个浮点数值是否相等的断言也可能失败。

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

1
我不喜欢 EXPECT_DOUBLE_EQ() 的一点是你无法提供误差范围。有时候,由于浮点数误差,特别是累积误差,测试仍然会失败。 - voxoid
Google的C++测试框架提供了比较两个浮点数的函数,可以根据给定的精度进行比较。有关精度的文档是否存在? - Ziqi Fan
@voxoid 如果这符合您的使用情况,您可以使用EXPECT_NEAR。 - Antonio
@ZiqiFan 文档中说“误差在4个ULP以内”。因此,用C++的术语来说,我猜测是4 * std::numeric_limits<double>::epsilon() - Antonio

-6

这只是Googletest中的一个bug。文本输出应该证明失败,但其格式没有被精确指定。


4
这并不是gtest中的一个bug,而是浮点数表示中数字的一个特性。这里提供了一个参考链接:https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html - alexisrozhkov
1
我相信发帖者的意思是,文本输出没有足够的小数位来显示两者不匹配是一个bug,而不是数字应该匹配。 - Alex Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接