我需要编写一个函数来检测传入它的数字是否未定义.在ocaml toplevel我发现了一些有趣的东西.
nan = nan;;
Run Code Online (Sandbox Code Playgroud)
这被证实是错误的.但后来我发现了一些更奇特的东西
nan == nan;;
Run Code Online (Sandbox Code Playgroud)
评估为真.=和==之间有什么区别,以及为什么第一次比较在将两个nans与自己进行比较时返回false?
正如@Colonel Thirty Two所说,NaN的标准行为不等于它自己.(这是一个好主意是一个单独的辩论.)
NaN值始终在物理上是相等的并不是真的:
# let x = 0.0 /. 0.0;;
val x : float = nan
# x == nan;;
- : bool = false
Run Code Online (Sandbox Code Playgroud)
物理平等==
是一个棘手的,依赖于实现的概念.粗略地说,它测试了值的共享,这对于像nan这样的不可变值是不可检测的.如果您确切知道自己在做什么,则只应在程序中使用它.
更新
您可以使用compare
以下方法测试NaN :
# let is_nan x = compare x nan = 0;;
val is_nan : float -> bool = <fun>
# is_nan nan;;
- : bool = true
# is_nan (1.0 /. 0.0);;
- : bool = false
# is_nan (0.0 /. 0.0);;
- : bool = true
Run Code Online (Sandbox Code Playgroud)