Question

Pourquoi suis-je recevoir ce résultat?

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

Quelle différence delta ont à faire valoir NaN est égal à un certain nombre? Certes, il faut toujours revenir faux. Je suis conscient de IsNaN, mais ce n'est pas utile ici (voir ci-dessous).

Arrière-plan: J'ai une fonction de retour NaN (par erreur), il était censé être un nombre réel mais le test encore passé. J'utilise le delta, car il est à double égalité de précision, le test original utilisé 1E-9.

Était-ce utile?

La solution

Lorsque vous utilisez Assert.AreEqual(1, double.NaN), il tente un test d'égalité sur le nombre et bien sûr il échoue, car double.NaN ne correspond pas à quoi que ce soit.

Quand vous faites Assert.AreEqual(1, double.NaN, 1E-1), il doit faire des opérations arithmétiques sur les chiffres. , Il calcule précisément

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 !=)

ce qui est faux. Il regarde comme le delta réel n'est pas plus grand que le delta vous avez passé, mais seulement car il tente d'indiquer que vous ne pouvez pas effectuer la comparaison.

Morale de l'histoire: le comportement de NaN est assez fou (mais les meilleurs des gens intelligents pourrait trouver). Faites de votre mieux pour vérifier NaN avant d'effectuer des calculs où vous ne pouvez pas avoir l'erreur se propage silencieusement, comme celui-ci.

Autres conseils

Avoir un coup d'oeil ici: Pourquoi Assert.AreEqual (1,0, Double.NaN, 1.0) passer?

Edit:

il y a certainement un bogue dans Assert.AreEqual. dans le Microsoft.VisualStudio.QualityTools.UnitTestFramework de VS 2008, il est codé comme

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

Comme dans votre cas Math.Abs((double) (expected - actual)) est un double.NaN, les rendements de comparaison false: -)

Pouvez-vous utiliser ce test pour NaN au lieu?

double.IsNaN(somenNumber)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top