Addition periodischer Brüche
-
Guten Abend,
stehe gerade vor einem (wahrscheinlich / hoffentlich) kleinem Problem: ich berechne über die Cardanischen Formeln Nullstellen diverser Polynome. Nun gibts Fälle, bei denen es in Zwischenschritten zu periodischen Brüchen kommt. Beispiel:
y2 = -0.666666666666667 rueckSub = 0.6666666666666666 // fuer die Ruecksubsitution
Nun errechnet man die Nullstelle durch Addition. Normal sollte ja ~0 rauskommen. Nur das errechnete Ergebnis ist -3.3306690738754696E-16.
Liegt das an der internen Darstellung der Gleitpunktzahlen? Wie lässt sich sowas am effektivsten vermeiden bzw. umgehen?
Für Anregungen vielen Dank im Voraus
-
hando schrieb:
Liegt das an der internen Darstellung der Gleitpunktzahlen? Wie lässt sich sowas am effektivsten vermeiden bzw. umgehen?
Ja. Im Computer gibt es nicht unendlich viel Speicherplatz. Vor allem gibt es dadurch auch keine Darstellung von Zahlen mit unendlich vielen Nachkommastellen. Deshalb muss irgendwo gerundet werden. Und diese Rundungsfehler schleppt man dann halt immer weiter mit. Das kannst Du nicht vermeiden: Wenn Du mit Fließkommazahlen rechnest, dann musst Du davon ausgehen, dass die Ergebnisse durchaus etwas vom richtigen Ergebnis abweichen. Wenn Du Ergebnisse vergleichen möchtest, kannst Du dann natürlich eine gewisse Toleranz miteinkalkulieren. Dann vergleichst Du eben nicht mit "==", sondern eher mit einer Art "Math.abs(a-b) < threshold".
-
Vielen Dank für die Erklärung Gregor.
Jetzt bleibt für mich aber immer noch die Frage, weshalb die Addition in diesem Fall nicht korrekt, und was man machen kann, dass sie richtig ausgeführt wird
Irgendwie sollte das doch möglich sein.
-
Die Addition wird im Rahmen der Genauigkeit korrekt ausgeführt und -3.3306690738754696E-16 ist ~0.
Zeige deine Ergebnisse gerundet an oder verwende BigDecimal.
-
Tatsache ... danke tfa! War wohl am Sonntag noch zu zeitig
-
Bin übrigens noch auf einen netten Beitrag zum Thema "Runden und Formatieren von Gleitkommazahlen in Java" gestoßen, der auch direkt noch Beispiele dafür bereitstellt. (Vielleicht der Vollständigkeit halber)
Einen guten Rutsch ins neue Jahr!