浮点等价?

时间:2009-07-29 20:40:28

标签: .net floating-point floating-accuracy

我希望能够比较两个双打,而不考虑可能的精确损失。是否有处理此案例的方法?

如果没有,是否有一个阈值/指南可以知道两个双打之间的等值是多少?

2 个答案:

答案 0 :(得分:6)

阈值完全取决于问题本身。对于某些问题,您可能会认为1.001等于1.002,对于某些问题,您可能需要更小的阈值。

一般技术是:

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

答案 1 :(得分:3)

一个非常好的,彻底的选择是:

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对此不是一个好的epsilon值。这会产生一个epsilon,它会随着你的第一个值的大小而稍微缩放,这有点帮助。