質問

なぜ私はこの結果を取得しています!

[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ですので、私はデルタを使用しています。

役に立ちましたか?

解決

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をチェックするために最善を尽くします。

他のヒント

ここで見てください:はなぜ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.NaNで、比較利回りはfalse: - )

あなたは?代わりにNaNのために、このテストを使用することができます。

double.IsNaN(somenNumber)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top