Rundungsfehler ?
-
- Beiträge: 134
- Registriert: So 30. Nov 2008, 21:53
Re: Rundungsfehler ?
Na, das ist doch schon mal ein Fortschritt.
Ich denke, wenn Du meine Ausführungen nachliest, habe ich nichts mM offensichtlich Fehlerhaftes behauptet. Das manche Fließkommaoperation nicht exakt sind (und das ist was anderes als korekt gerundet), ist eine Binsenweisheit. Aber es gibt Methoden und Algorithmen um halbwegs stabil solche Problem zu lösen (nennt sich Numerische Mathematik oder neudeutsch 'Scientific computing') und es gibt seit meht als 50 Jahren ausführliche Literatur dazu, und nicht nur Wikipedia.
Und jetzt endgültig Gute Nacht.
Ich denke, wenn Du meine Ausführungen nachliest, habe ich nichts mM offensichtlich Fehlerhaftes behauptet. Das manche Fließkommaoperation nicht exakt sind (und das ist was anderes als korekt gerundet), ist eine Binsenweisheit. Aber es gibt Methoden und Algorithmen um halbwegs stabil solche Problem zu lösen (nennt sich Numerische Mathematik oder neudeutsch 'Scientific computing') und es gibt seit meht als 50 Jahren ausführliche Literatur dazu, und nicht nur Wikipedia.
Und jetzt endgültig Gute Nacht.
-
- Beiträge: 1908
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Rundungsfehler ?
Stimmt hab an die Numerik gar nicht gedacht. Da sollte man natürlich wissen wie die Sprache rundet. Aber das ist ja alles wohldefiniert und ich glaube nicht das der große Teil der Pascal Entwickler selbst solche Algorithmen entwickeln. Beschweren kann man sich da nicht
-
- Beiträge: 6167
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Rundungsfehler ?
Socke hat geschrieben:Mathias hat geschrieben:Anscheinend ist die Kohle wieder mal wichtiger als die mathematische Genauigkeit."Somit hat dieses Bank-Runden durchaus seine Richtigkeit/Sinn. Es ist um einiges gerechter."
In der Schule hatten wir mal, alles was grösser als x.5 ist, wird aufgerundet.
Dann tut es mir Leid um deine Lehrer; diese hätten später beibringen sollen, dass man auch anders runden kann.
Dies war noch in der Grundschule, und da gab es noch keine PCs.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6167
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Rundungsfehler ?
Ich habe mal ein wenig das Wiki angepasst, so das jedermann das Runden sieht.
http://wiki.freepascal.org/Round/de
http://wiki.freepascal.org/Round/de
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Rundungsfehler ?
Socke hat geschrieben:Dies war noch in der Grundschule, und da gab es noch keine PCs.
Bei Software ist es grundsätzlich verboten, sich auf den genauen Wert einer Real-Zahl zu verlassen. Realzahlen sind nur im Rahmen einer Genauigkeit (also +/- x%) verlässlich. Wenn die Zahl also z.B. 0.5 ist, muss man sie als irgendwo zwischen 0.5+% und 0.5-x% ansehen. Demzufolge ist die Rundung für den Programmierer grundsätzlich nicht vorhersehbar. Jedes Verhalten der Software ist absolut zulässig.
Dasselbe gilt natürlich auch für alle Real -> Integer Wandlung von Werten in der Nähe von ganzen Zahlen. Obwohl hier vermutlich sicher gestellt ist, dass bei nur gewandelten Werten, die nicht durch eine Berechnung gehen, die Rück-Wandlung das von Dummies erwartete Ergebnis liefert
Code: Alles auswählen
r: real;
i: integer;
i := 1;
r := i;
i := r; // nicht runden, sondern Abschneiden !
i := 1;
r := i;
r := r / 3.0;
r := r * 3.0;
i := r; // Das Ergebnis ist nicht verlässlich
-Michael
Zuletzt geändert von mschnell am Mi 30. Mai 2018, 10:41, insgesamt 3-mal geändert.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Rundungsfehler ?
Mathias hat geschrieben:Ich habe mal ein wenig das Wiki angepasst, so das jedermann das Runden sieht.
Absolut korrekter und wichtiger Hinweis für Ignoranten, die nicht wissen, wie man mit Real-Werten umgehen muss.
Ich habe den Eintrag mal technisch ergänzt und emotional gerade gerückt.
-Michael
Re: Rundungsfehler ?
mschnell hat geschrieben:Demzufolge ist die Rundung für den Programmierer grundsätzlich nicht vorhersehbar.
Nur wenn das Ergebnis in der Nähe von x.5 liegt.
mschnell hat geschrieben:Code: Alles auswählen
r: real;
i: integer;
i := 1;
r := i;
i := r; // nicht runden, sondern Abschneiden !
i := 1;
r := i;
r := r / 3.0;
r := r * 3.0;
i := r; // Das Ergebnis ist nicht verlässlich
Versteh ich nicht.
Warum muss ich, wenn das Ergebnis nahe einer ganzen Zahl liegen muss, trunc() aufrufen statt round()? Bei dem Beispiel liefert Round immer das richtige Ergebnis, Trunc is nicht verlässlich, z.B. falls r als 2.99999999999999999532341 rauskommt. Nur wenn das Ergebnis x.5 erwartet wird, muss man - ggfs. neben dem BankersRouding - noch bedenken, dass das x.5 auch als x.499999999999 ausfallen kann - dann rundet Round in die falsche Richtung. Aber ehrlich gesagt, wenn das eine Rolle spielt, dann muss man halt eine Dezimalstelle mehr anzeigen.
Generell sollte man nur runden, wenn das Endergebnis einer Rechnung angezeigt werden soll. Problematisch ist es, wenn Rechen-Ergebnisse gerundet in Edit Controls etc. gespeichert und von dort in weiteren Rechnungen weiterverwendet werden.
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Rundungsfehler ?
mschnell hat geschrieben:Ich habe den Eintrag mal technisch ergänzt und emotional gerade gerückt.
Wo wir gerade beim Wiki sind: ich habe die Information zu SetRoundingMode eingefügt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Rundungsfehler ?
Socke hat geschrieben:Wo wir gerade beim Wiki sind: ich habe die Information zu SetRoundingMode eingefügt.
Und ich habe mir erlaubt, die Details etwas auszuführen - die offizielle Doku, auf die du verlinkst, ist wie immer sehr karg.
-
- Beiträge: 134
- Registriert: So 30. Nov 2008, 21:53
Re: Rundungsfehler ?
Mathias hat geschrieben:Ich habe mal ein wenig das Wiki angepasst, so das jedermann das Runden sieht.
http://wiki.freepascal.org/Round/de
Ist noch ein kleiner Fehler drin: 12.5 wird auch 12 gerundet nicht auf 1.
Socke hat geschrieben:mschnell hat geschrieben:Ich habe den Eintrag mal technisch ergänzt und emotional gerade gerückt.
Wo wir gerade beim Wiki sind: ich habe die Information zu SetRoundingMode eingefügt.
Leider ist der Eintrag unter http://lazarus-ccr.sourceforge.net/docs ... gmode.html ziemlich falsch. Es wird natürlich nicht auf das nächste Integer gerundet sondern auf die nächste darstellbare Fließkommazahl, man beachte dieses Runden wird bei jeder Operation angewendet, es wäre ja schlimm, wenn 10+Pi = 13 wäre. Was in dem Link beschrieben wird, ist die nur Auswirkung auf die Funktion round. Die Delphi6-Hilfe ist genauer
Code: Alles auswählen
rmNearest Rounds to the closest value.
rmDown Rounds toward negative infinity.
rmUp Rounds toward positive infinity.
rmTruncate Truncates the value, rounding positive numbers down and negative numbers up.
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Rundungsfehler ?
indianer-frank hat geschrieben:Leider ist der Eintrag unter http://lazarus-ccr.sourceforge.net/docs ... gmode.html ziemlich falsch. Es wird natürlich nicht auf das nächste Integer gerundet sondern auf die nächste darstellbare Fließkommazahl, man beachte dieses Runden wird bei jeder Operation angewendet, es wäre ja schlimm, wenn 10+Pi = 13 wäre. Was in dem Link beschrieben wird, ist die nur Auswirkung auf die Funktion round.
Kannst du hierzu bitte einen Bug-Eintrag erstellen? Am besten fügst du einen besseren, selbstgeschriebenen Text direkt bei.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Rundungsfehler ?
indianer-frank hat geschrieben:Mathias hat geschrieben:Ich habe mal ein wenig das Wiki angepasst, so das jedermann das Runden sieht.
http://wiki.freepascal.org/Round/de
Ist noch ein kleiner Fehler drin: 12.5 wird auch 12 gerundet nicht auf 1.
Ist korrigiert; auch habe ich die Variablen im Beispiel-Code angepasst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 134
- Registriert: So 30. Nov 2008, 21:53
Re: Rundungsfehler ?
Socke hat geschrieben:indianer-frank hat geschrieben:Leider ist der Eintrag unter http://lazarus-ccr.sourceforge.net/docs ... gmode.html ziemlich falsch. Es wird natürlich nicht auf das nächste Integer gerundet sondern auf die nächste darstellbare Fließkommazahl, man beachte dieses Runden wird bei jeder Operation angewendet, es wäre ja schlimm, wenn 10+Pi = 13 wäre. Was in dem Link beschrieben wird, ist die nur Auswirkung auf die Funktion round.
Kannst du hierzu bitte einen Bug-Eintrag erstellen? Am besten fügst du einen besseren, selbstgeschriebenen Text direkt bei.
Mach ich nach der Mittagspause.
Edit: Fertig, siehe https://bugs.freepascal.org/view.php?id=33805
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Rundungsfehler ?
wp_xyz hat geschrieben:Nur wenn das Ergebnis in der Nähe von x.5 liegt.
Na klar.
wp_xyz hat geschrieben:Warum muss ich, wenn das Ergebnis nahe einer ganzen Zahl liegen muss, trunc() aufrufen statt round()
Der Kommentar soll bedeuten, dass bei einer Zuweisung real-> integer der Compiler nicht Round(), sondern Trunc() einbaut.
-Michael
Zuletzt geändert von mschnell am Mi 30. Mai 2018, 16:21, insgesamt 3-mal geändert.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Rundungsfehler ?
wp_xyz hat geschrieben:Und ich habe mir erlaubt, die Details etwas auszuführen - die offizielle Doku, auf die du verlinkst, ist wie immer sehr karg.
Super ! SetRoundMode(ARoundMode) kannte ich noch nicht.
-Michael