Pregunta

Quiero poder comparar dos dobles sin tener en cuenta una posible pérdida de precisión. ¿Existe algún método que maneje este caso?

Si no, ¿hay un umbral / directriz para saber cuánto es una equivalencia adecuada entre dos dobles?

¿Fue útil?

Solución

El umbral es completamente dependiente del problema en sí. Para algunos problemas, puede considerar que 1.001 es igual a 1.002 y para algunos problemas, es posible que necesite un umbral mucho más pequeño.

El técnico general es:

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

Otros consejos

Una muy buena y completa opción para esto es:

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

Tenga en cuenta que Double.Epsilon NO es un buen valor épsilon para esto. Esto crea una épsilon que se amplía un poco con la magnitud de su primer valor, lo que ayuda bastante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top