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?
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?
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.
Die Semantik der physikalischen Gleichheit (==) ist:
x == y
wahr ist impliziert compare x y
0 ist (was bedeutet, x = y usualy)x == y
wahr ist, wenn und nur wenn, mutieren x auch beeinflussenDas 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)
Insbesondere siehe http://stackoverflow.com/a/13596236/2864740 – user2864740
Lesen Sie http://floating-point-gui.de (nützlich um allgemein zu lesen, auch wenn Sie Ihre Frage nicht beantworten) –