【发布时间】:2014-09-19 01:16:06
【问题描述】:
为什么 1 == 1 返回 true 而 1.0 == 1.0 返回 false?
我认为 = 是结构性的,== 是物理性的,所以不应该都返回 false 吗?
【问题讨论】:
-
阅读floating-point-gui.de(一般来说阅读很有用,即使没有回答您的问题)
为什么 1 == 1 返回 true 而 1.0 == 1.0 返回 false?
我认为 = 是结构性的,== 是物理性的,所以不应该都返回 false 吗?
【问题讨论】:
问题不在于价值观,问题在于物理平等==。除了某些特定的保证之外,它的含义是依赖于实现的。
在通常的 OCaml 实现中,浮动值被装箱,因此没有两个 float 类型的值在物理上相等是正常的。
相反,int 值没有装箱,因此两个相等的 int 值在物理上是相等的。
除非您非常确定自己知道自己在做什么,否则不应使用物理平等。在这种情况下,它违反了函数式语言的许多所需属性,例如引用透明性。
更新:对于== 含义的具体保证由Pierre Chambart 在他的出色回答中给出。
【讨论】:
物理相等(==)的语义是:
x == y 为真意味着 compare x y 为 0(通常意味着 x = y)x == y 为真当且仅当,变异 x 也会影响 y仅此而已,不要假设其他任何事情。 (见 {http://caml.inria.fr/pub/docs/manual-ocaml-4.02/libref/Pervasives.html#VAL%28==%29}
请注意,compare x y = 0 并不完全等同于 x = y,因为 nan 不等于无,包括它自己
(顺便说一句,自 Ocaml 4.02 起,优化使 1.0 == 1.0 在本机代码中为真,但在字节码中不是)
【讨论】: