Math.Max vs Enumerable.Max

9 .net math floating-point double nan

Jon Skeet今天报道(来源):

Math.Max(1f, float.NaN) == NaN
new[] { 1f, float.NaN }.Max() == 1f
Run Code Online (Sandbox Code Playgroud)

为什么?

编辑:同样的问题也加倍!

adr*_*nks 5

他还解释了原因所在这个后续的tweet:

这是因为扩展方法使用(并记录使用)IComparable的实现,它将任何内容与> NaN进行比较.


Jon*_*eet 4

正如其他人所发布的,我在推特上发布了一种“为什么”——因为它IComparable按照记录使用。

但这只会导致另一个“为什么”。尤其:

Console.WriteLine(Math.Max(0, float.NaN));  // Prints NaN
Console.WriteLine(0f.CompareTo(float.NaN)); // Prints 1
Run Code Online (Sandbox Code Playgroud)

第一行表明 NaN 被视为大于 0。第二行表明 0 被视为大于 NaN。(当然,这些都不能报告“这种比较没有意义”的结果。)

当然,我的优势是可以看到所有回复推文,包括 两条

这可能看起来很不寻常,但这是正确的答案。当且仅当所有元素均为 NaN 时,数组的 max() 为 NaN。请参阅 IEEE 754r。

此外,Math.Max 使用 IEEE 754r 总排序谓词,它指定 NaN 与其他的相对排序。