我正在测试一些代码,一些涉及使用浮点值进行计算的数字 - 通常是非常大的数字。我有一些通用的(C++ 模板化的,但对于这个问题来说并不重要)代码将我的输出(无论是标量还是数组)与它们的预期值进行比较。
我面临着选择精度阈值的问题,至少对于两种 C/C++ 浮点类型 float
和 double
- 对于各种函数我正在测试。原样well known ,就比较浮点值而言,没有一刀切的方法,也没有仅基于数据类型的适合和计算的单一精度值:相对误差与绝对误差,可能会放大 float 的众多操作舍入误差很大,计算结果应该为 0,因此您无法真正按预期值归一化,等等。
为浮点值选择比较方法(和相等阈值)的一般合理方法/算法/经验法则是什么?
最佳答案
我喜欢 googletest 中使用的方法,例如EXPECT_DOUBLE_EQ(a,b) 和 EXPECT_FLOAT_EQ(a,b):如果它们在最后位置(4 ULP)的 4 个单位以内,则数字大致相等。为此,您
- 将符号幅度转换为偏移量
- 像整数一样减去
- 检查差异 <= 4。
这会自动缩放幅度并放松到绝对接近零。
关于testing - 什么是好的经验法则浮点比较方法选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071066/