什么是良好的经验法则浮点比较方法选择器?

时间:2016-05-06 11:18:40

标签: testing floating-point comparison precision idioms

我正在测试一些代码,一个涉及使用浮点值进行计算的数字 - 通常是非常大量的代码。我有一些通用的(C ++ - 模板化,但这对于这个问题并不重要)代码将我的输出(无论是标量还是数组)与它们的预期值进行比较。

我遇到了为我正在测试的各种函数选择精度阈值的问题,至少对于两个C / C ++浮点类型floatdouble。与well known一样,在比较浮点值方面没有一刀切,也没有单一的精度值,它只适合于基于数据类型的计算:相对与绝对误差,众多可能会大量放大浮点舍入误差的操作,应该达到0的计算,因此无法按预期值进行真正的标准化等。

为浮点值选择比较方法(和相等阈值),通常合理的方法/算法/经验法则是什么?

2 个答案:

答案 0 :(得分:1)

我喜欢googletest中使用的方法,例如EXPECT_DOUBLE_EQ(a,b)和EXPECT_FLOAT_EQ(a,b):如果它们在最后位置(4 ULP)内的4个单位内,则数字大致相等。要做到这一点,你

  1. 将signed-magnitude转换为offset
  2. 减去好像是整数
  3. 检查差异< = 4。
  4. 这会自动缩放幅度并放松到接近零的绝对值。

答案 1 :(得分:0)

没有一般合理的方法: - (

数字的一个重要特性是数字集可以被划分为等价类,其中同一等价类的所有成员都是"相等"在某种意义上,两个不同等价类的所有成员都不等于"。该属性对于排序算法和散列非常重要。

如果你使用53位尾数加倍,并且只用零填充尾数的最后几位,那么你仍然有等价类,排序/散列也可以正常工作。另一方面,两个数字可以任意地靠近在一起,并且仍然与该方法相当。

另一种方法是使用一种算法来判断两个数字是否等于"可能相等"。你可以将其他所有内容都基于此。例如,a"肯定更大"如果a>> b和a不等于"可能相等"到b。 a是可能更大的"如果a>> b或a是"可能相等"到b。

排序是有问题的。你可能有一个"可能相等"到b,和b"可能相等"到c,但a不是"可能相等"到c。

如果使用带有53位尾数的double,则两个不相关的数字在45位内不太可能相等。因此,您可以非常合理地检查差异的绝对值是否小于较大数字的绝对值除以2 ^ 45。您的里程会有很大差异。重要的是你是否认为0应该等于非常小的数字。