ocaml - =和==的区别和nans的比较

标签 ocaml

我需要编写一个函数来检测传入的数字是否未定义。在 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/

相关文章:

functional-programming - 用 OCaml 等函数式语言实现直接线程解释器

ocaml - 为什么 Reason 数组是可变的?

algorithm - 层次二叉树遍历的魔法代码——发生了什么?

ocaml - 用元组作为参数定义异常

garbage-collection - 影子绑定(bind)会被 GCed 吗?

OCaml 语法 : what does >>= mean?

ocaml - 在 Num 模块中表示无穷大

ubuntu - 程序中不允许使用 OCaml '_a?

ocaml - Opam 总是被锁文件锁住

functional-programming - 为什么OCaml有两个排序函数: List. sort和List.stable_sort?