浮点等价?(Floating point equivalence?)

2019-09-21 08:34发布

我希望能够比较两个双打忽略一个可能的精度损失。 有没有一种方法已经是处理这种情况?

如果没有,是否有阈值/准则知道多少是两个双打之间的适当等价?

Answer 1:

阈值是完全依赖于问题本身。 对于一些问题,你可能会考虑1.001等于1.002和一些问题,你可能需要一个更小的阈值。

一般己技巧是:

Math.Abs(a - b) < some_epsilon    // `a` is roughly equivalent to `b`


Answer 2:

这方面的一个很好的,全面的选项是:

public static bool DoubleEquality(double a, double b) 
{
    const double epsilonValue = 1e-15;
    if (double.IsNaN(a))
        return double.IsNaN(b);
    else if (double.IsInfinity(a))
        return double.IsInfinity(b);
    else if (a == 0) 
        return b == 0;
    else
        return Math.Abs(a - b) <= Math.Abs(a * epsilonValue);
}

需要注意的是Double.Epsilon是不是一个很好的小量值。 这将创建一个与你的第一个值的大小,这有助于颇有几分几分秤的ε。



文章来源: Floating point equivalence?