Weil 1.1
und 3.3
floating point numbers sind. Dezimalbrüche wie .1 oder .3 sind in einer binären Gleitkommazahl nicht exakt darstellbar. .1 bedeutet 1/10. Um das binär darzustellen, wo jede Bruchzahl 1/2 n (1/2, 1/4, 1/8, usw.) darstellt, würden Sie unendlich viele Ziffern benötigen, 0.000110011 ... unendlich wiederholend.
Dies ist genau das gleiche Problem wie etwa 1/3 in Basis 10. In der Basis 10 benötigen Sie eine unendliche Anzahl von Ziffern, .33333 ... für immer, um genau 1/3 darzustellen. In der Basis 10 arbeitest du normalerweise rund um etwas wie .33. Aber wenn Sie drei Kopien davon addieren, erhalten Sie .99, nicht 1.
Für weit mehr Informationen zu diesem Thema lesen Sie What Every Computer Scientist Should Know About Floating Point Arithmetic.
Um rationale Zahlen in Haskell genauer darzustellen, können Sie immer den rationalen Datentyp verwenden, Ratio
; gekoppelt mit Bignums (beliebig große ganze Zahlen, Integer
in Haskell, im Gegensatz zu Int
, die feste Größe sind) als der Typ für Zähler und Nenner, können Sie beliebig genaue rationale Zahlen, aber mit einer deutlich niedrigeren Geschwindigkeit als Gleitkommazahlen, die sind in Hardware implementiert und auf Geschwindigkeit optimiert.
Fließkommazahlen sind eine Optimierung, für wissenschaftliche und numerische Berechnungen, die Präzision für hohe Geschwindigkeit ausgleichen, so dass Sie eine große Anzahl von Berechnungen in kurzer Zeit durchführen können, solange Sie sich der Rundung bewusst sind Es beeinflusst Ihre Berechnungen.
Nizza Javascript Float - Dezimal - binäre Visualizer: http://babbage.cs.qc.edu/IEEE-754/Decimal.html – Seth
Dies ist kein Haskell-spezifisches Problem: das gleiche wird in jeder Sprache passieren, dass verwendet Gleitkommazahlen. Die genauen Details hängen von der Fließkomma-Implementierung ab, aber die meisten Prozessoren verwenden IEEE-754, das eng spezifiziert ist, um sicherzustellen, dass Programme sich überall genau gleich benehmen. –