代码之家  ›  专栏  ›  技术社区  ›  Anzurio

浮点等价?

  •  1
  • Anzurio  · 技术社区  · 17 年前

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

    如果没有,是否有一个阈值/指南来了解两个双精度之间的足够等效性是多少?

    2 回复  |  直到 17 年前
        1
  •  6
  •   Mehrdad Afshari    17 年前

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

    一般技术是:

    Math.Abs(a - b) < some_epsilon    // `a` is roughly equivalent to `b`
    
        2
  •  3
  •   Reed Copsey    17 年前

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

    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);
    }
    

    推荐文章