T.M. schriebFurry schriebGleitkommazahlen sind leider nicht absolut genau. Daher sind Vergleiche nicht so einfach.
Das wusste ich.
$1 = 0.10000000000000001
Aber dass es so schnell gehen kann, hätt ich nicht gedacht. Ich mein, die Zuweisung einer Konstante und die Addition einer weiteren Konstante sind doch exakte Operationen, daran ist doch nichts ungenau, nichts genähert. Das sind doch quasi Integeroperationen, nur dass irgendwo noch ein Komma hineininterpretiert wird. Danke!
Ja, mich erstaunt das auch immer wieder. Dabei wurde hier gar keine Addition vorgenommen, sondern nur eine Zuweisung. Aber selbst eine Zuweisung ist nicht exakt. Das liegt daran, dass Gleitkommazahlen nicht einfach als ein Integer mit Komma gespeichert werden sondern in der Folgenden Form:
Gleitkommazahl x = s * m * 2^e
Hierbei ist s das Vorzeichen (-1, 1), m die Mantisse (normiert, 1 <= m < 2) und e der Exponent (Integer). In unserem Beispiel ist das Vorzeichen s = 1, der Exponent e = floor(log_2(0.1)) = -4 und die Mantisse m = 1.6:
x = 1 * 1.6 * 2^(-4)
Wie das Vorzeichen und der Exponent als Integer Bit-Repräsentation gespeichert werde ist denke ich klar (sind ja beides bereits Integer). Bei der Mantisse ist das aber nicht so einfach. Wenn wir eine Mantissenbreite von 23 Bits (bei einfacher Genauigkeit) annehmen, rechnet man (m - 1) * 2^23 = 5033164.8 und es wird auf 5033165 gerundet.
Bei Zurückrechnen ergibt sich damit eine tatsächliche Gleitkommazahl von:
x = 1 * 5033165/2^23 * 2^(-4) = 0.10000000149
Bei doppelter Genauigkeit ist der Effekt nicht so groß, wie man oben sieht.
MfG (Mit flauschigen Grüßen)
Furry