6

なぜこの結果が得られるのですか?

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

NaNが数値に等しいと主張することでデルタはどのような違いがありますか?確かにそれは常にfalseを返すはずです。私はIsNaNを知っていますが、ここでは役に立ちません(以下を参照)。

背景:NaNを(誤って)返す関数があります。これは実数であることが意図されていましたが、テストに合格しました。デルタを使用しているのは、倍精度の等式であるためです。元のテストでは1E-9を使用していました。

4

3 に答える 3

4

を使用するAssert.AreEqual(1, double.NaN)と、数値の等価性テストが試行されますが、double.NaNは何にも等しくないため、もちろん失敗します。

あなたがするときAssert.AreEqual(1, double.NaN, 1E-1)、それは数の算術をしなければなりません。具体的には、

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

これは誤りです。実際のデルタは、渡した値よりも大きくないように見えdeltaますが、これは、比較を実行できないことを示しているためです。

話の教訓:NaNの振る舞いはかなりクレイジーです(しかし、賢い人が思いつくことができる最高のものです)。このように、エラーをサイレントに伝播させることができない計算を実行する前に、NaNをチェックするために最善を尽くしてください。

于 2010-03-26T15:43:19.327 に答える
2

ここを見てください:Assert.AreEqual(1.0、double.NaN、1.0)が合格するのはなぜですか?

編集:

には間違いなくバグがありAssert.AreEqualます。VS 2008のMicrosoft.VisualStudio.QualityTools.UnitTestFrameworkでは、次のようにコード化されています。

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

あなたの場合のように、比較Math.Abs((double) (expected - actual))は次のようになります:-)double.NaNfalse

于 2010-03-26T15:43:11.250 に答える
1

代わりに、このテストをNaNに使用できますか?

double.IsNaN(somenNumber)
于 2010-03-26T15:37:55.460 に答える