首页 文章

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

提问于
浏览
1

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

对于我正在测试的各种函数,我面临着选择精度阈值的问题,至少对于两个C / C浮点类型 floatdouble . 与well known一样,在比较浮点值方面没有一刀切,也没有单一的精度值适合和仅基于数据类型计算:相对与绝对误差,可能放大的大量操作浮点舍入错误很多,计算应该达到0,所以你不能真正按预期值进行标准化等 .

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

2 回答

  • 0

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

    • 将signed-magnitude转换为offset

    • 减去好像它们是整数

    • 检查差异<= 4 .

    这会自动缩放幅度并放松到接近零的绝对值 .

  • 1

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

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

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

    另一种方法是使用一种算法来确定两个数字是否“可能相等” . 你可以将其他所有内容都基于此 . 例如,如果a> b和a与b不“可能相等”,则a“绝对大于”b . 如果a> b或a与b“可能相等”,则a“可能大于”b .

    排序是有问题的 . 你可能有一个“可能等于”b,b“可能等于”c,但a与c“不一定”相等 .

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

相关问题