Double.NaN égalité dans MS test
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.
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)