Der Martin: wann überspring periodischer Binärbruch eine +zahl

Beitrag lesen

Hi,

Angenommen ich mache eine Endlosschleife die den Wert 0.1 immer um 0.1 erhöht.

dann ist deine Schrittweite 0.1 eben nicht *exakt* 0.1, sondern ein bisschen mehr oder weniger. Das fällt aber wegen der internen Rundung zunächst nicht auf.

Das würde doch bedeuten, dass wenn ich sagen wir ein float für die Zahl 0.1 verwenden würde sie ja doch am ende gerundet werden, also würde ich einen Wert in der Richtung

0,100000000000000000000000032 bekommen, wenn ich diesen Wert aber immer wieder Addiere bekomme ich doch irgendwann mal einen - wie soll ich es nenne- übersprung

Betrachten wir ein Beispiel. Nehmen wir an, Fließkommazahlen würden so gespeichert, dass 6 signifikante Stellen angezeigt werden, intern aber mit 7 Stellen gerechnet wird. Dann könnte 0.1 intern in Wirklichkeit zum Beispiel 0.100'000'1 sein, weil 0.1 eben nicht exakt als Binärbruch darstellbar ist. Die letzte Stelle wird aber bei der Ausgabe gerundet. Nur zur Klarheit: Die Rechnung an sich ist exakt, da entstehen keine zusätzlichen Fehler!

Nach der ersten Addition bokommst du 0.200'000'2, das wird immer noch abgerundet.
Nach der zweiten Addition bokommst du 0.300'000'3, das wird immer noch abgerundet.
Irgendwann kriegst du aber 0.500'000'5 raus, und das wird bei der Ausgabe zu 0.500'001 aufgerundet.

zahlen.....9,19999999
überspring eine 0.1 Sequenz wegen Nachkommastellen

Naja, wenn du das Spiel beliebig weitertreibst, kommst du irgendwann auch an einen solchen Punkt. Aber dann wäre deine Anwendung wegen irgendwelcher Rechenfehler, die bis dahin schon offensichtlich werden, schon längst auf die Nase gefallen.

Es wird aber noch viel lustiger. Wenn deine Summe irgendwann so groß wird, dass die Zehntelstelle schon nicht mehr gespeichert wird (wir erinnern uns: wir haben intern nur 7 signifikante Stellen zur Verfügung), dann addierst du auf einmal effektiv 0 zu einer sehr großen Zahl:

1'000'000
  +        0.100'000'1
  ---------------
   1'000'000

Die Zehntelstelle, in der sich das Ergebnis der Addition zeigen müsste, existiert nämlich jetzt gar nicht mehr!

verkürztes Bsp.:
0,1 würde direkt wegen den übersprung 0,3 werden aber wann ist es so weit bzw. wie kann man sowas berrechnen.

Man kann das abschätzen, wenn man weiß, wieviele Bits das verwendete Fließkommaformat für die Mantisse verwendet. Das IEEE-float hat normalerweise 23bit (ohne Vorzeichen), das entspricht etwa 7 Dezimalstellen; double hat normalerweise 52bit (ohne Vorzeichen), das entspricht etwa 16 Dezimalstellen.

So long,
 Martin

--
Wer im Steinhaus sitzt, soll nicht mit Gläsern werfen.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(