Estoy ejecutando pruebas NUnit para evaluar algunos datos de prueba conocidos y resultados calculados. Los números son dobles en coma flotante, así que no espero que sean exactamente iguales, pero no estoy seguro de cómo tratarlos con la misma precisión.Evaluar si dos dobles son iguales en función de una precisión determinada, no dentro de una cierta tolerancia fija
En NUnit podemos comparar con una tolerancia fija:
double expected = 0.389842845321551d;
double actual = 0.38984284532155145d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));
y que funciona bien para los números bajo cero, pero a medida que los números crecen de la tolerancia que realmente necesita ser cambiado por lo que siempre se preocupan por el mismo número de dígitos de precisión.
En concreto, esta prueba falla:
double expected = 1.95346834136148d;
double actual = 1.9534683413614817d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));
y por supuesto un mayor número fallan con la tolerancia ..
double expected = 1632.4587642911599d;
double actual = 1632.4587642911633d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));
¿Cuál es la forma correcta de evaluar dos números de coma flotante son iguales con una precisión dada ? ¿Hay una forma incorporada de hacer esto en NUnit?
Esta es una muy buena solución, pero genera una excepción al comparar '0.0' a' 0.0'. Sin embargo, una simple condición 'si' alrededor de 'expected' se encargaría de eso. –
Ah sí. Pensé que habría algo. :) He actualizado mi respuesta para tener esto en cuenta. – Brett
esto funcionó muy bien. Ejecuté 105 pruebas unitarias, aproximadamente la mitad positivas y la mitad negativas, y todas menos 8 pasaron. La respuesta de Michael Borgwardt pasó y no pasó exactamente las mismas pruebas. –