JS-Fehler bei der Addition???
Markus
- javascript
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.
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
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.
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
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...
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