为什么NaN和数字的最大值是NaN,但是NaN的min和数字是多少?这似乎与我尝试的其他几种语言不一致:
在Haskell:
max (0/0) 1 -- NaN
min (0/0) 1 -- 1.0
在Python中
>>> max(float("nan"),1) #nan
>>> min(float("nan"),1) #nan
在JavaScript中
> Math.max(0/0,1) //NaN
> Math.min(0/0,1) //NaN
答案 0 :(得分:10)
Haskell报告指出(min x y, max x y)
将返回(x, y)
或(y, x)
。这是一个不错的属性,但难以与NaN的对称处理相协调。
值得一提的是,这与SSE2指令MINSD
和MAXSD
展示的完全相同,即Haskell min
(Double
)MINSD
和max
可由MAXSD
实施。
答案 1 :(得分:8)
不完全,min 1.0 (0/0)
将返回NaN,例如。
这是因为任何与NaN的比较都被定义为返回false,并且定义为min和max:
max x y
| x <= y = y
| otherwise = x
min x y
| x <= y = x
| otherwise = y
使用NaN的min和max将分别返回第二个和第一个参数。
答案 2 :(得分:7)
我不是Haskell程序员,但看起来浮点函数被称为fmin
和fmax
。无论出于何种原因,应用于浮点类型的泛型函数都不遵循标准数字行为。
fmin
和fmax
符合IEEE 754:2008§5.3.1:
minNum(x,y)是规范化数字 x ,如果 x&lt; y , y 如果 y&lt; x ,规范化的数字,如果一个操作数是一个数字而另一个是一个安静的NaN。
请注意,此行为与JavaScript相反。不要像JavaScript那样做; v)。