Periodischer Binärbruch : wann überspring periodischer Binärbruch eine +zahl

Hallo,

ich habe mal eine Verständisfrage.

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

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

Bsp.:

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

also da ich immer um 0.1 erhöhe komm ich ja irgendwann auf große zahlen, aber irgendwann haben doch die rundungszahlen am ende eine bedeutung, so dass sie eine Zahl überspringen würden.

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.

Ich hoffe jemand versteht meine Problematik.

Gruß Chris

  1. Hi Chris.

    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.

    Das hängt logischerweise von der verwendeten Sprache (und ggf. der Plattform) ab. Wenn man weiß, wie die Sprache floats handhabt, braucht es keine Zauberei, um das zu berechnen. Ansonsten schon.

    Floats eignen sich selten gut zum Iterieren. Wenn Du diese Probleme umgehen willst, dann addiere einfach sukzessive 1 (als integer) aufeinander (und berechne dann in jedem Schritt Deinen gewünschten float-Wert daraus, das ist in dem Fall ja nicht so schwer). Je nach Umgebung könnte auch decimal als Datentyp interessant sein.

    Viele Grüße
    der Bademeister

  2. 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:(
    1. Hallo Martin

      du "rechenst mit dem Schlimmsten" :-)