Domanda

Perché mi appare questo risultato?

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

Che differenza fa il delta ha nel far valere NaN è uguale a un numero? Sicuramente dovrebbe sempre restituire false. Sono consapevole del isNaN, ma non è utile qui (vedi sotto).

Sfondo: Ho una funzione che restituisce NaN (erroneamente), è stato concepito per essere un numero reale ma il test ancora passata. Sto usando il delta perché è doppia uguaglianza precisione, la prova originale utilizzato 1E-9.

È stato utile?

Soluzione

Quando si utilizza Assert.AreEqual(1, double.NaN), cerca un test di uguaglianza sui numeri e naturalmente fallisce, poiché double.NaN non è uguale a niente.

Quando si esegue Assert.AreEqual(1, double.NaN, 1E-1), ha a che fare l'aritmetica sui numeri. Specificamente, esso calcola

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

che è falso. E ' guarda come il delta attuale non è più grande della delta avete passato, ma solo in quanto sta cercando di indicare che non è possibile eseguire il confronto.

Morale della favola: il comportamento di Nan è abbastanza folle (ma i migliori alcune persone intelligenti potrebbe venire con). Fate del vostro meglio per verificare la presenza di NaN prima di eseguire qualsiasi calcolo in cui non si può avere l'errore si propaga in silenzio, come questo.

Altri suggerimenti

Date un'occhiata qui: Perché Assert.AreEqual (1.0, Double.NaN, 1.0) passare?

Modifica:

c'è sicuramente un bug in Assert.AreEqual. in Microsoft.VisualStudio.QualityTools.UnitTestFramework VS 2008 è codificato come

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

Come nel tuo caso è un Math.Abs((double) (expected - actual)) double.NaN, i rendimenti di confronto false: -)

Potresti utilizzare questo test per NaN invece?

double.IsNaN(somenNumber)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top