首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Math.Max vs Enumerable.Max

Math.Max vs Enumerable.Max
EN

Stack Overflow用户
提问于 2011-01-09 04:18:45
回答 6查看 711关注 0票数 9

Jon Skeet今天(source)报道:

代码语言:javascript
复制
Math.Max(1f, float.NaN) == NaN
new[] { 1f, float.NaN }.Max() == 1f

为什么?

编辑: double也有同样的问题!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-09 04:37:44

正如其他人发布的那样,我在推特上写了一种“为什么”--因为它使用的是文档中记录的IComparable

不过,这只会引出另一个“为什么”。特别是:

代码语言:javascript
复制
Console.WriteLine(Math.Max(0, float.NaN));  // Prints NaN
Console.WriteLine(0f.CompareTo(float.NaN)); // Prints 1

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

当然,我有一个优势,就是可以看到所有的回复推文,包括these two

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

此外,Math.Max使用IEEE754r总排序谓词,它指定NaN与其他对象之间的相对排序。

票数 4
EN

Stack Overflow用户

发布于 2011-01-09 04:27:22

他还在this后续推文中解释了原因:

这是因为扩展方法使用(并记录为使用) IComparable的实现,该实现将任何内容都比较为>NaN。

票数 5
EN

Stack Overflow用户

发布于 2011-01-09 04:36:11

对(正确)答案的一个补充说明:两者的行为都与文档记录的一样,即使您只阅读简单的解释也是如此。

此IEnumerable上的Max()扩展名:

返回单个值序列中的最大值。

和Math.Max():

返回参数val1或val2中较大的一个。如果val1、val2或val1和val2都等于NaN,则返回NaN。

请注意,NaN不是一个值-因此可枚举的Max总是返回最大的值。Math.Max返回两个值中较大的一个,如果两个值中的一个或两个都为NaN,则返回NaN。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4635923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档