Markus: JS-Fehler bei der Addition???

Hallo

Ich hatte ein größeres JavaScript geschrieben, doch es arbeitete falsch. Es irritierte mich, weil ich sicher war, dass alles richtig programmiert war. Das Problem lag dann in einer Schleife, in der ein Wert jedesmal um 0.01 erhöht wird.

Und da ist das Problem: JavaScript kann 0.05 und 0.01 nicht richtig zusammenzählen.

alert(0.05+0.01);
ich erwarte als ausgabe 0.06 was aber nicht ausgegeben wird.

  1. Hi,

    Ich hatte ein größeres JavaScript geschrieben, doch es arbeitete falsch.

    nein, Gott hat falsch gearbeitet. Er hat dem Menschen eine Anzahl Finger gegeben, die keiner Zweierpotenz entspricht. Beim Rechnen im davon abgeleiteten Zahlensystem kommen Ergebnisse vor, die sich in ein auf den sehr viel bequemeren Zweierpotenzen basierendeem System nicht mit endlicher Stellenanzahl darstellen lassen.

    alert(0.05+0.01);
    ich erwarte als ausgabe 0.06 was aber nicht ausgegeben wird.

    Korrekt. Dafür bräuchte es unendlich viele Stellen, die ein lineares Speichersystem schwerlich verwalten kann. Runde das Ergebnis.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Runde das Ergebnis

      OK. Das wird wohl das einfachste sein.

      Übrigens:
      bei http://de.selfhtml.org/javascript/beispiele/taschenrechner.htm ist es leider auch so.

      1. Hi,

        Übrigens:
        bei http://de.selfhtml.org/javascript/beispiele/taschenrechner.htm ist es leider auch so.

        natürlich doch. Auch dort wurde von Menschen ausgegangen, die im Laufe ihrer Evolution vorwiegend zehn Finger (inklusive der Daumen, versteht sich) hatten. Der Fehler wird überall dort auftreten, wo von dieser Annahme ausgegangen wurde.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hi there,

    Und da ist das Problem: JavaScript kann 0.05 und 0.01 nicht richtig zusammenzählen.

    Nobody is perfect.

    ich erwarte als ausgabe 0.06 was aber nicht ausgegeben wird.

    Es ist ohenhin nie gut, mit Fliesskommazahlen zu rechen, auch wenn JS keine so starke Typisierung kennt; Du kannst entweder das Ergebnis runden, besser aber ist es, alle Zahlen vorher mit entsprechenden Faktoren zu multiplizieren (in Deinem Fall zB 100) und dann das Ergebnis durch eben diesen Faktor zu dividieren. Damit vermeidest Du auch die Gefahr der Aufsummierung von Rundungsfehlern...

  3. Hi,

    Ich hatte ein größeres JavaScript geschrieben, doch es arbeitete falsch. Es irritierte mich, weil ich sicher war, dass alles richtig programmiert war.

    Du machst das noch nicht so lange, was? ;-)

    Das Problem lag dann in einer Schleife, in der ein Wert jedesmal um 0.01 erhöht wird.

    Und da ist das Problem: JavaScript kann 0.05 und 0.01 nicht richtig zusammenzählen.

    Doch, tut es. Streng nach Vorschrift (IEEE) sogar.

    alert(0.05+0.01);
    ich erwarte als ausgabe 0.06 was aber nicht ausgegeben wird.

    Deine Erwartungshaltung ist, wie bereits von anderer Seite angemerkt, nicht ordnungsgemäß. Die Mathematik lebt nur von der Defintion ihrer selber, also mußt Du _immer_ darauf achten, welche Definition gilt!

    Etwas Literatur:
    http://www.validlab.com/goldberg/paper.pdf
    http://developer.intel.com/technology/itj/q41999/articles/art_6.htm
    Der Standard selber kostet leider etwas (etwas viel wie ich meine):
    http://standards.ieee.org/catalog/ordering.html
    Wie's bei anderen aussieht:
    http://www.research.ibm.com/journal/rd/435/schwarz.html
    Mathemtik dahinter:
    http://www.psc.edu/general/software/packages/ieee/ieee.html
    Misc.:
    http://webster.cs.ucr.edu/AoA/DOS/ch14/CH14-1.html#HEADING1-52
    http://cch.loria.fr/documentation/IEEE754/index.html#wkahan
    http://www.research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html
    Hier im Archiv (ja, der ist von mir, aber das liegt an meinem Gedächnis, nicht an anderem ;-):
    [http://forum.de.selfhtml.org/archiv/2005/5/t107456/#m667413]

    so short

    Christoph Zurnieden