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

jek*_*jek 18 haskell

为什么NaN和数字的最大值是NaN,但是NaN的最小值和数字是多少?这似乎与我尝试的其他一些语言不一致:

在Haskell:

max (0/0) 1 -- NaN
min (0/0) 1 -- 1.0
Run Code Online (Sandbox Code Playgroud)

在Python中

>>> max(float("nan"),1) #nan
>>> min(float("nan"),1) #nan
Run Code Online (Sandbox Code Playgroud)

在JavaScript中

> Math.max(0/0,1) //NaN
> Math.min(0/0,1) //NaN
Run Code Online (Sandbox Code Playgroud)

aug*_*tss 10

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

另外值得一提的是,这是完全一样的不对称性的SSE2指令集MINSDMAXSD展览,即哈斯克尔min(对Double)可以通过实现MINSDmax通过MAXSD.


Eva*_*ian 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
Run Code Online (Sandbox Code Playgroud)

min和max with NaN将分别返回第二个和第一个参数.

  • IEEE 754:2008§5.3.1规定带有NaN的`min`和`max`忽略NaN并返回数字.如果Haskell声称遵循标准浮点行为,那么这就是一个错误. (7认同)
  • @Potatoswatter Haskell不**声称符合IEEE 754.例如,在[Haskell 98 Report](http://www.haskell.org/onlinereport/basic.html)中它说:"*默认由Haskell Prelude**定义的浮点运算不符合当前语言无关算术(LIA)标准.*这些标准在数值结构中要求相当复杂,因此已经降级为库.一些但不是全部在Prelude类`RealFloat`中已经考虑了IEEE浮点标准的各个方面. (5认同)

Pot*_*ter 7

我不是一个Haskell程序员,但现在看来,浮点函数被调用fminfmax.无论出于何种原因,应用于浮点类型的泛型函数都不遵循标准数字行为.

fminfmax遵守IEEE 754:2008§5.3.1:

minNum(x,y)是规范化的数字x,如果x <y,y,如果y <x,则规范化的数字,如果一个操作数是数字而另一个是安静的NaN.

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