Fließkomma Zahlenfehler

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • Jeder dezimale INTEGER Wert (rationale Zahl, "Ganzzahl") kann exakt Binär dargestellt werden. Dies gilt nicht für Fließkomma Zahlen (irrationale Zahl, Zahl mit Nachkommaanteil)
    Eine irrationale Zahl ist eine reelle Zahl, die keine rationale Zahl ist. Eine irrationale Zahl ist dadurch gekennzeichnet, dass sie kein Verhältnis von ganzen Zahlen ist. Eine reelle Zahl heißt irrational, wenn sie nicht als Bruch zweier ganzer Zahlen dargestellt werden kann. Eine bekannte irrationale Zahl ist PI.

    Merke: Jede irrationale Zahl im Dezimalsystem ist in jedem anderen Zahlensystem irrational!
    Für das Binärsystem im Besonderen gilt: Jede Bruchteil einer ganzen Zahl ("Nachkommawert"), in der Form p/q (wobei q eine ganzzahlige Potenz von 2 ist), kann exakt dargestellt werden mit einer endlichen Anzahl von BIT.


    Auch Dezimalbrüche wie 1/10000 oder 0,0001 können Binär nicht exakt dargestellt werden. Hierbei liegt die Periode bei 104 BIT (periodische Wiederkehr von Teilungsbrüchen).
    Dies erklärt, warum bei diesem einfachen Beispiel...

    BASCOM-Quellcode

    1. SUM = 0
    2. FOR I% = 1 TO 10000
    3. SUM = SUM + 0.0001
    4. NEXT I%
    5. PRINT SUM ' Theoretically = 1.0.


    1.000054 ausgegeben wird.

    Ein kleiner Fehler macht sich bei der Darstellung der Summierung von 0.0001 bemerkbar!
    Aus diesem Grund sollten sie sehr vorsichtig mit dem Vergleich reeller Zahlen umgehen. Das folgende Beispiel zeigt einen häufig begangenen Programmierfehler:

    BASCOM-Quellcode

    1. item1# = 69.82#
    2. item2# = 69.20# + 0.62#
    3. IF item1# = item2# then print "Equality!"
    Dies wird NICHT "Equality!" (GLEICH) AUSGEBEN, weil 69.82 im Binärsystem nicht exakt dargestellt werden kann.
    Der Wert der binären Berechnung unterscheidet sich also geringfügig von dem direkt zugewiesenen Wert.
    In der Praxis sollten sie diesen Vergleich mit einer gewissen Toleranz ausführen.

    5.246 mal gelesen