Frage

Warum bin ich dieses Ergebnis zu bekommen?

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

Was Unterschied hat das Delta bei der Durchsetzung NaN gleich eine Zahl? Sicherlich sollte es immer false zurück. Ich bin mir dessen bewusst IsNaN, aber das ist nicht sinnvoll, hier (siehe unten).

Hintergrund: Ich habe eine Funktion Rückkehr NaN (fälschlicherweise), war es bedeutet, eine reelle Zahl zu sein, aber den Test noch bestanden. Ich bin mit dem Delta, weil es mit doppelter Genauigkeit Gleichheit ist, der Original-Test verwendet 1E-9.

War es hilfreich?

Lösung

Wenn Sie Assert.AreEqual(1, double.NaN) verwenden, es versucht, einen Gleichheitstest auf die Zahlen und natürlich scheitert es, da double.NaN nicht alles gleich ist.

Wenn Sie Assert.AreEqual(1, double.NaN, 1E-1) tun, hat es auf die Zahlen Arithmetik zu tun. Insbesondere ist es berechnet

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

, die falsch ist. Es Aussehen wie das eigentliche Delta ist nicht größer als die delta Sie vergangen, aber nur weil es versucht, um anzuzeigen, dass Sie den Vergleich nicht durchführen können.

Die Moral der Geschichte: das Verhalten von NaN ziemlich verrückt ist (aber die best einige klug Leute konnte kommen mit). Geben Sie Ihr Bestes für NaN zu überprüfen, bevor Sie Berechnungen ausführen, bei denen Sie nicht der Fehler propagieren bis leise haben kann, wie dieser.

Andere Tipps

Haben Sie einen Blick hier: Warum Assert.AreEqual (1,0, Double.NaN, 1.0) paßt?

Edit:

Es ist auf jeden Fall ein Fehler in Assert.AreEqual. in VS 2008 ist Microsoft.VisualStudio.QualityTools.UnitTestFramework es codiert als

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

Wie in Ihrem Fall Math.Abs((double) (expected - actual)) ist ein double.NaN, die Vergleichs Ausbeuten false: -)

Könnten Sie verwenden diesen Test für NaN statt?

double.IsNaN(somenNumber)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top