2014-09-16 17 views
6

Warum gibt 1 == 1 wahr und 1.0 == 1.0 zurück falsch?Warum ist "1.0 == 1.0" in Ocaml falsch?

Ich denke = ist strukturell und == ist physikalisch, also sollten beide nicht falsch zurückgeben?

+1

Insbesondere siehe http://stackoverflow.com/a/13596236/2864740 – user2864740

+0

Lesen Sie http://floating-point-gui.de (nützlich um allgemein zu lesen, auch wenn Sie Ihre Frage nicht beantworten) –

Antwort

11

Das Problem ist nicht mit den Werten, das Problem ist mit physikalischer Gleichheit ==. Seine Bedeutung ist bis auf bestimmte spezifische Garantien umsetzungsabhängig.

In der üblichen OCaml-Implementierung sind Floating-Werte eingerahmt, daher ist es normal, dass keine zwei Werte vom Typ float physisch gleich sind.

Umgekehrt sind int-Werte nicht eingerahmt, also sind zwei gleiche int-Werte physikalisch gleich.

Physische Gleichheit sollte nicht verwendet werden, außer Sie sind sich sicher, dass Sie wissen, was Sie tun. Es verletzt viele gewünschte Eigenschaften einer funktionalen Sprache, wie z. B. referentielle Transparenz, wie in diesem Fall.

Update: Die spezifischen Garantien für die Bedeutung von == werden von Pierre Chambart in seiner ausgezeichneten Antwort gegeben.

9

Die Semantik der physikalischen Gleichheit (==) ist:

  • auf einen beliebigen Wert x == y wahr ist impliziert compare x y 0 ist (was bedeutet, x = y usualy)
  • auf veränderbare Werte, wenn x == y wahr ist, wenn und nur wenn, mutieren x auch beeinflussen

Das ist alles, nehme nichts anderes an. (Siehe {http://caml.inria.fr/pub/docs/manual-ocaml-4.02/libref/Pervasives.html#VAL%28==%29}

Beachten Sie, dass compare x y = 0 ist nicht genau entspricht x = y weil nan nicht gleich nichts, selbst einschließlich

(übrigens seit Ocaml 4.02 eine Optimierung macht 1.0 == 1.0 wahr in nativen Code, aber nicht in bytecode)