質問
なぜ私はこの結果を取得しています!
[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)