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: 2144
- 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: 6958
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Rundungsfehler ?
Dies war noch in der Grundschule, und da gab es noch keine PCs.Socke hat geschrieben:Dann tut es mir Leid um deine Lehrer; diese hätten später beibringen sollen, dass man auch anders runden kann.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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6958
- 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 ?
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.Socke hat geschrieben:Dies war noch in der Grundschule, und da gab es noch keine PCs.
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
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 ?
Absolut korrekter und wichtiger Hinweis für Ignoranten, die nicht wissen, wie man mit Real-Werten umgehen muss.Mathias hat geschrieben:Ich habe mal ein wenig das Wiki angepasst, so das jedermann das Runden sieht.
Ich habe den Eintrag mal technisch ergänzt und emotional gerade gerückt.
-Michael
Re: Rundungsfehler ?
Nur wenn das Ergebnis in der Nähe von x.5 liegt.mschnell hat geschrieben: Demzufolge ist die Rundung für den Programmierer grundsätzlich nicht vorhersehbar.
Versteh ich nicht.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
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: 3178
- 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 ?
Wo wir gerade beim Wiki sind: ich habe die Information zu SetRoundingMode eingefügt.mschnell hat geschrieben:Ich habe den Eintrag mal technisch ergänzt und emotional gerade gerückt.
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 ?
Und ich habe mir erlaubt, die Details etwas auszuführen - die offizielle Doku, auf die du verlinkst, ist wie immer sehr karg.Socke hat geschrieben:Wo wir gerade beim Wiki sind: ich habe die Information zu SetRoundingMode eingefügt.
-
- Beiträge: 134
- Registriert: So 30. Nov 2008, 21:53
Re: Rundungsfehler ?
Ist noch ein kleiner Fehler drin: 12.5 wird auch 12 gerundet nicht auf 1.Mathias hat geschrieben:Ich habe mal ein wenig das Wiki angepasst, so das jedermann das Runden sieht.
http://wiki.freepascal.org/Round/de
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 genauerSocke hat geschrieben:Wo wir gerade beim Wiki sind: ich habe die Information zu SetRoundingMode eingefügt.mschnell hat geschrieben:Ich habe den Eintrag mal technisch ergänzt und emotional gerade gerückt.
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: 3178
- 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 ?
Kannst du hierzu bitte einen Bug-Eintrag erstellen? Am besten fügst du einen besseren, selbstgeschriebenen Text direkt bei.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.
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: 3178
- 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 ?
Ist korrigiert; auch habe ich die Variablen im Beispiel-Code angepasst.indianer-frank hat geschrieben:Ist noch ein kleiner Fehler drin: 12.5 wird auch 12 gerundet nicht auf 1.Mathias hat geschrieben:Ich habe mal ein wenig das Wiki angepasst, so das jedermann das Runden sieht.
http://wiki.freepascal.org/Round/de
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 ?
Mach ich nach der Mittagspause.Socke hat geschrieben:Kannst du hierzu bitte einen Bug-Eintrag erstellen? Am besten fügst du einen besseren, selbstgeschriebenen Text direkt bei.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.
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 ?
Na klar.wp_xyz hat geschrieben:Nur wenn das Ergebnis in der Nähe von x.5 liegt.
Der Kommentar soll bedeuten, dass bei einer Zuweisung real-> integer der Compiler nicht Round(), sondern Trunc() einbaut.wp_xyz hat geschrieben:Warum muss ich, wenn das Ergebnis nahe einer ganzen Zahl liegen muss, trunc() aufrufen statt round()
-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 ?
Super ! SetRoundMode(ARoundMode) kannte ich noch nicht.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.
-Michael