在Haskell中使用NaN的最大值和最小值

时间:2014-08-19 03:32:00

标签: haskell

为什么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

3 个答案:

答案 0 :(得分:10)

Haskell报告指出(min x y, max x y)将返回(x, y)(y, x)。这是一个不错的属性,但难以与NaN的对称处理相协调。

值得一提的是,这与SSE2指令MINSDMAXSD展示的完全相同,即Haskell minDoubleMINSDmax可由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程序员,但看起来浮点函数被称为fminfmax。无论出于何种原因,应用于浮点类型的泛型函数都不遵循标准数字行为。

fminfmax符合IEEE 754:2008§5.3.1:

  

minNum(x,y)是规范化数字 x ,如果 x&lt; y y 如果 y&lt; x ,规范化的数字,如果一个操作数是一个数字而另一个是一个安静的NaN。

请注意,此行为与JavaScript相反。不要像JavaScript那样做; v)。