Pregunta

¿Por qué recibo este resultado?

[TestMethod]
public void nan_test()
{
    Assert.AreEqual(1, double.NaN, 1E-1); <-- Passes
    Assert.AreEqual(1, double.NaN);       <-- Fails
}

¿Qué diferencia tiene el delta en la afirmación de NaN es igual a un número? Sin duda, siempre debe devolver false. Soy consciente de isNaN, pero eso no es útil en este caso (véase más adelante).

Antecedentes: Tengo una función que devuelve NaN (erróneamente), que estaba destinado a ser un número real, pero la prueba sigue siendo pasado. Estoy usando el delta porque es doble precisión la igualdad, la prueba original utilizó 1E-9.

¿Fue útil?

Solución

Cuando se utiliza Assert.AreEqual(1, double.NaN), se trata de una prueba de igualdad en los números y por supuesto que no, ya que double.NaN no es igual a nada.

Al hacer Assert.AreEqual(1, double.NaN, 1E-1), que tiene que ver la aritmética de los números. En concreto, se calcula

Math.Abs((double) (expected - actual)) > delta
Math.Abs(1 - double.NaN) > 1E-1
Math.Abs(double.NaN) > 1E-1 // All arithmetic with double.NaN returns double.NaN
double.NaN > 1E-1 // All comparisons with double.NaN return false (except !=)

cual es falso. Es miradas como el delta real no es más grande que el delta que ha pasado, pero sólo porque está tratando de indicar que no se puede realizar la comparación.

Moraleja de la historia: el comportamiento de NaN es bastante loco (pero los mejores que algunas personas inteligentes podría llegar a). Haga todo lo posible para verificar si hay NaN antes de realizar ningún cálculo donde no se puede tener propagar el error silenciosamente, como éste.

Otros consejos

Para consultar aquí: ¿Por qué Assert.AreEqual (1.0, Double.NaN, 1,0) pase?

Editar:

definitivamente hay un error en Assert.AreEqual. en VS 2008 Microsoft.VisualStudio.QualityTools.UnitTestFramework se codifica como

if (Math.Abs((double) (expected - actual)) > delta)
{
    // report error
}

Al igual que en su caso es un Math.Abs((double) (expected - actual)) double.NaN, los rendimientos de comparación false: -)

¿Podría utilizar esta prueba para NaN lugar?

double.IsNaN(somenNumber)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top