1

我希望能够比较两个双打而不考虑可能的精度损失。是否已经有一种方法可以处理这种情况?

如果没有,是否有一个阈值/指南来知道两个双打之间的充分等效性是多少?

4

2 回答 2

6

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

一般技术是:

Math.Abs(a - b) < some_epsilon    // `a` is roughly equivalent to `b`
于 2009-07-29T20:41:15.023 回答
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,它会随着您的第一个值的大小而缩放,这很有帮助。

于 2009-07-29T20:51:33.643 回答