Frage

Ich möchte einen möglichen Genauigkeitsverlust zwei verdoppelt vergleichen können abgesehen. Gibt es eine Methode bereits, dass dieser Fall behandelt?

Wenn nicht, gibt es eine Schwelle / Richtlinie zu wissen, wie viel ist eine ausreichende Gleichwertigkeit zwischen zwei Doppeln?

War es hilfreich?

Lösung

Die Schwelle ist völlig abhängig, um das Problem selbst. Für einige Probleme, könnte man 1.001 gleich 1,002 und für einige Probleme betrachten, könnten Sie eine viel kleinere Schwelle müssen.

Die allgemeine techique ist:

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

Andere Tipps

Eine sehr gute, gründliche Option hierfür ist:

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

Beachten Sie, dass Double.Epsilon keine gute epsilon Wert ist. Dadurch entsteht ein epsilon, die etwas mit der Größe des ersten Wertes skaliert, was ziemlich viel hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top