c语言浮点数无法与零比较,C的零浮点数比较失败与Gtest

本文探讨了一个在单元测试中遇到的古怪现象,即EXPECT_FLOAT_EQ宏在比较0.2f-1.0f+0.9f与0.1f时失败,尽管结果几乎相等。作者深入分析了浮点数精度问题,涉及MSVC2015环境,并质疑了gtest的精度设置。读者可能对此类数学和测试工具行为的细微差别感兴趣。
摘要由CSDN通过智能技术生成

我们正在努力进行一次单位测试.在调查期间,我们找到了根本原因,这似乎是浮点数的比较(请参阅下面的代码片段,其中我简化了计算,但仍然失败).

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精度,它是否偶然失败? (这对我们来说也不是很清楚).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值