Dot-Net

為什麼 Assert.AreEqual(1.0, double.NaN, 1.0) 通過?

  • March 9, 2015

簡短的問題,為什麼會Assert.AreEqual(1.0, double.NaN, 1.0)通過?而Assert.AreEqual(1.0, double.NaN)失敗。

它是 MSTest (Microsoft.VisualStudio.QualityTools.UnitTestFramework) 中的錯誤還是我在這裡遺漏了什麼?

最好的問候,埃吉爾。


更新:可能應該補充一點,我的問題背後的原因是,由於某些線性代數矩陣運算的結果是 NaN 或 (+/-)Infinity,我有一堆單元測試不幸通過了。單元測試很好,但是由於當實際或/和預期為 NaN 或 Infinity 時,帶有增量的雙精度數上的 Assert.AreEqual 將通過,所以我不得不相信我正在測試的程式碼是正確的。

當心。NaN 很奇怪,有點像許多 DBMS 中的 null,您不應該將值與它進行比較(直接或使用 Assert.AreEqual)。來自Double.NaN的文件:

使用 IsNaN 確定值是否不是數字。無法通過將一個值與另一個等於 NaN 的值進行比較來確定一個值是否不是數字。

double zero = 0;
Console.WriteLine((0 / zero) == Double.NaN);  // prints false
Console.WriteLine(Double.IsNaN(0 / zero));  // prints true

您必須查看 Assert(double, double, double) 的內部以了解發生了什麼,但總的來說,您依賴於相對於 NaN 的未定義行為。

引用自:https://stackoverflow.com/questions/1780004