Pergunta

Por que estou obtendo esse resultado?

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

Que diferença o delta tem em afirmar que a NAN é igual a um número? Certamente deve sempre retornar falso. Estou ciente de Isnan, mas isso não é útil aqui (veja abaixo).

Antecedentes: Eu tenho uma função retornando NAN (erroneamente), era para ser um número real, mas o teste ainda foi aprovado. Estou usando o Delta porque é uma igualdade de precisão dupla, o teste original usado 1E-9.

Foi útil?

Solução

Quando você usa Assert.AreEqual(1, double.NaN), tenta um teste de igualdade nos números e, é claro, falha, pois double.NaN não é igual a nada.

Quando você faz Assert.AreEqual(1, double.NaN, 1E-1), ele tem que fazer aritmética nos números. Especificamente, ele 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 !=)

o que é falso. Isto parece como o delta real não é maior que o delta Você passou, mas apenas porque está tentando indicar que você não pode executar a comparação.

Moral da história: o comportamento de Nan é muito louco (mas as melhores pessoas inteligentes podem criar). Faça o seu melhor para verificar a NAN antes de executar quaisquer cálculos em que você não pode ter o erro se propagar silenciosamente, como este.

Outras dicas

Dê uma olhada aqui: Por que assert.areeeQual (1.0, duplo.nan, 1.0) passa?

Editar:

Definitivamente há um bug em Assert.AreEqual. no Microsoft.VisualStudio.QualityToolTools.UnittestFramework, é codificado como codificado como

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

Como no seu caso Math.Abs((double) (expected - actual)) é um double.NaN, a comparação produz false :-)

Você poderia usar este teste para NAN?

double.IsNaN(somenNumber)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top