我需要编写一个函数来检测传入的数字是否未定义。在 ocaml toplevel 中我发现了一些有趣的东西。
nan = nan;;
这评估为错误。但是后来我发现了更奇特的东西
nan == nan;;
计算结果为真。 = 和 == 有什么区别,为什么在将两个 nan 与它们自己进行比较时第一次比较返回 false?
最佳答案
正如@Colonel 三十二所说,NaN 不等于自身是标准行为。 (这是否是一个好主意是一个单独的辩论。)
NaN 值在物理上总是相等是不正确的:
# let x = 0.0 /. 0.0;;
val x : float = nan
# x == nan;;
- : bool = false
物理相等 ==
是一个棘手且依赖于实现的概念。粗略地说,它测试值的共享,这对于像 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
关于ocaml - =和==的区别和nans的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575664/