Dot-Net
Math.Max 與 Enumerable.Max
Math.Max(1f, float.NaN) == NaN new[] { 1f, float.NaN }.Max() == 1f為什麼?
編輯:雙倍也有同樣的問題!
正如其他人所發布的那樣,我在推特上發布了一種“為什麼”——因為它是
IComparable按照記錄使用的。但這只會導致另一個“為什麼”。尤其是:
Console.WriteLine(Math.Max(0, float.NaN)); // Prints NaN Console.WriteLine(0f.CompareTo(float.NaN)); // Prints 1第一行表明 NaN 被認為大於 0。第二行表明 0 被認為大於 NaN。(當然,這些都不能報告“這種比較沒有意義”的結果。)
這可能看起來不尋常,但這是正確的答案。如果所有元素都是 NaN,則數組的 max() 為 NaN。參見 IEEE 754r。
此外,Math.Max 使用 IEEE 754r 總排序謂詞,它指定 NaN 與其他的相對排序。
他還在這條後續推文中解釋了原因:
這是因為擴展方法使用(並且被記錄為使用)IComparable 的實現,它將任何東西都比較為> NaN。