为什么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指令集MINSD和MAXSD展览,即哈斯克尔min(对Double)可以通过实现MINSD和max通过MAXSD.
例如,不完全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将分别返回第二个和第一个参数.
我不是一个Haskell程序员,但现在看来,浮点函数被调用fmin和fmax.无论出于何种原因,应用于浮点类型的泛型函数都不遵循标准数字行为.
fmin并fmax遵守IEEE 754:2008§5.3.1:
minNum(x,y)是规范化的数字x,如果x <y,y,如果y <x,则规范化的数字,如果一个操作数是数字而另一个是安静的NaN.
请注意,此行为与JavaScript相反.不要像JavaScript那样做; v).
| 归档时间: |
|
| 查看次数: |
1059 次 |
| 最近记录: |