我们正在努力进行一次单位测试.在调查期间,我们找到了根本原因,这似乎是浮点数的比较(请参阅下面的代码片段,其中我简化了计算,但仍然失败).
TEST_F( MyFloatTest, thisOneDoesFail)
{
const float toCompare = 0.2f - 1.0f + 0.9f;
EXPECT_FLOAT_EQ( toCompare, 0.1f );
}
结果是:
Actual: 0.1
Expected: toCompare
Which is: 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精度,它是否偶然失败? (这对我们来说也不是很清楚).