奇怪的谷歌测试失败与浮点数
Strange Google Test failure with floating point numbers
我在测试浮点值与 Google Test 1.7.0 的相等性时遇到了一些麻烦。
我的断言看起来像这样:
ASSERT_NEAR(124691356.375f, actual, DELTA);
测试失败,并显示以下错误:
124691356.375f 与实际之间的差异为 3.625,超过了 DELTA,其中 124691356.375f 的计算结果为 124691360,实际的计算结果为 124691356.375,DELTA 的计算结果为 0.0625。
这是怎么回事? actual
和预期结果显然在 0.0625 的允许误差范围内。 为什么 gtest 以这种方式计算浮点文字124691356.375f
?
更新:DELTA
和 actual
的类型为 double,预期值为浮点文本。 如果我将文字更改为双精度,或将其他参数更改为浮点数(以便所有内容都属于同一类型),则测试通过。 问题仍然存在 - 当类型不匹配时,是什么导致了这种行为?
>124691356.375f
是一个单精度浮点数,具有 7-8 个有效的十进制数字。因此,它被"四舍五入"为124691360,这不在允许的误差范围内。您可能应该使用 124691356.375lf
.另请参阅维基百科和这个问题。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 在数学上将浮点数四舍五入到 N 位小数
- 即使具有适当的分面,非有限浮点数的反序列化也会失败
- 奇怪的谷歌测试失败与浮点数