Thread Runden *war Subtrahieren in Perl ...
(55 answers)
Opened by Muffi at 2013-09-25 10:41
Du gibst Beispiele in denen "nearest" liefert was du erwartest. Das kann man aber auch anders herum betrachten:
Code (perl): (dl
)
say nearest(0.01, 0.004999999999998+0.000000000000001); Sollte eigentlich 0.00 ergeben Aber es kommt 0.01 raus. Nur weil du weißt wie viele Stellen für dich relevant sind heißt es nicht, das die Funktion es weiß. In deinem Beispiel sind dir drei Stellen hinter dem Komma relevant. Mir sind im Beispiel oben aber 15 Stellen hinterm Komma relevant. Für dich macht die Funktion das richtige für mich das falsche. Wer liegt nun richtig? Das hat nichts damit zu tun das hier niemand Fließkommazahlen versteht, sondern damit wie die Werte, die da sind, interpretiert werden sollen. "0.004999999999999" ist nun mal nicht "0.005". Du kannst jetzt sagen das eine Funktion zum Runden "raten" soll ob das nun das Ergebnis einer schlechten Rechnung, oder ob so gewollt ist. Das hat erst mal nichts damit zu tun ob die Zahl als Fließkommawert gespeichert wurde oder andres. Ich stehe auf dem Standpunkt das ein Computer nicht "Raten" sollte. Dein Standpunkt ist da wohl eher, das der Computer sich nach dem Wahrscheinlichsten richten soll. Das liefert ja auch in vielen Fällen gute Ergebnisse, aber halt nicht immer. Ich stehe auf dem Standpunkt das der Programmierer selbst entscheiden sollte wo eine gewisse Ungenauigkeit OK ist: Rechne mit 2.024-2.019 + 5e-10 und das Ergebnis ist auch bei meiner Funktion wie von dir erwartet. Damit sage ich nichts weiter als das mit 10 Stellen hinterm Komma genau genug sind. Aber das sollte meine Entscheidung sein. Ich kann den Fehler ausgleichen. Aber das muss ich immer angepasst auf die Situation machen. |