【发布时间】:2016-05-31 08:38:53
【问题描述】:
一段时间以来,我们一直在为我的一个单元测试而苦苦挣扎。在调查过程中,我们找到了根本原因,这似乎是浮点数的比较(参见下面的代码 sn-p,我已经简化了计算但仍然失败)。
TEST_F( MyFloatTest, thisOneDoesFail)
{
const float toCompare = 0.2f - 1.0f + 0.9f;
EXPECT_FLOAT_EQ( toCompare, 0.1f );
}
结果是:
实际:0.1 预期:比较 即:0.099999964
拥有一些数值数学背景,我们仍然无法弄清楚为什么这个测试会失败,而使用 std::numerical_limits::epsilon 的自定义浮点比较通过了。 所以在某个时候,我们开始认为 GTest 是错误的,我们对其进行了调试。它使用奇怪的表达方式,我们没有完全掌握。 更奇怪的是:以下测试通过,即使我只是添加了一个 1:
TEST_F( MyFloatTest, thisOnePasses)
{
const float toCompare = 1.2f - 1.0f + 0.9f;
EXPECT_FLOAT_EQ( toCompare, 1.1f );
}
我们认为在包含负浮点值时可能会出现问题,但下一个测试也通过了:
TEST_F( MyFloatTest, thisOnePassesAlso)
{
const float toCompare = 0.2f - 1.0f + 1.9f;
EXPECT_FLOAT_EQ( toCompare, 1.1f );
}
所以对我们来说,Gtest 的 EXPECT_FLOAT_EQ 宏似乎只是在零附近存在问题。 有谁知道这种行为?你有没有在你的环境中看到过类似的情况? (顺便说一句:我们使用 MSVC2015)是否由于 GTest 中提到的 4 ULP 精度而意外失败? (我们也不完全清楚)。
【问题讨论】:
-
This 可能会有所帮助
-
显示EXPECT_FLOAT_EQ宏怎么样?
标签: c++ floating-point googletest numerical