Nur löst keine dieser Optionen das Problem mit den x.5 . Siehe ersten Post.mschnell hat geschrieben: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
Rundungsfehler ?
-
- Beiträge: 6899
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Rundungsfehler ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 134
- Registriert: So 30. Nov 2008, 21:53
Re: Rundungsfehler ?
Ich warne dringend davor, SetRoundMode zu verwenden, wenn man nur ungefähr weiß, was damit eingestelllt wird. Alles außer Round-to-Nearest macht die FPC-Floatingpoint-Routinen (zB in math) oder andere noch sub-optimaler als sie eh schon sind, die Fehlerschranken pro Operation verdoppeln sich in etwa.mschnell hat geschrieben: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
Wenn man unbedingt eine eigene Roundroutine haben will, kann man for positive x myround(x: real) = trunc(x + 0.5) verwenden (für negative x dann entsprechend auch das Negative)
-
- Beiträge: 6899
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Rundungsfehler ?
Das gute alte Turbo-Pascal rundet bei x.5 immer auf, so wie man es erwartet. Wen man Pech hat, kann man Stunden verweilen, warum auf einmal ein bestehender Code Fehler macht, besonders bei einem Grafik-Programm. Nur weil jemand eine gute Idee hatte mit dem Bankerrunden. 

Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Rundungsfehler ?
Ich finde es OK, wenn es ein Banker-Rounding gibt, aber bitte nicht als round(). round() sollte wirklich ab 0.5 aufrunden.
round() ist eine Basisfunktion und sollte sich demnach wie eine solche verhalten.
Das Banker-Rounding ist ein finanzmathematischer Sonderfall und gehört m.E. anders benannt z.B. roundfinancial()?.
Und wenn Delphi es tausend mal so macht, ich nutze Delphi nicht.
Ich habe mich irgendwann für Lazarus entschieden, weil es eben nicht Delphi ist.
Und inzwischen bevorzuge ich CodeTyphon, weil es sich eben nicht so extrem um die Delphikompatibilität (oder besser Einschränkungen) schert und somit innovativ(er) sein kann.
round() ist eine Basisfunktion und sollte sich demnach wie eine solche verhalten.
Das Banker-Rounding ist ein finanzmathematischer Sonderfall und gehört m.E. anders benannt z.B. roundfinancial()?.
Und wenn Delphi es tausend mal so macht, ich nutze Delphi nicht.

Ich habe mich irgendwann für Lazarus entschieden, weil es eben nicht Delphi ist.
Und inzwischen bevorzuge ich CodeTyphon, weil es sich eben nicht so extrem um die Delphikompatibilität (oder besser Einschränkungen) schert und somit innovativ(er) sein kann.

Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Beiträge: 6899
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Rundungsfehler ?
Dieser Meinung bin ich auch.Ich finde es OK, wenn es ein Banker-Rounding gibt, aber bitte nicht als round(). round() sollte wirklich ab 0.5 aufrunden.
round() ist eine Basisfunktion und sollte sich demnach wie eine solche verhalten.
Das Banker-Rounding ist ein finanzmathematischer Sonderfall und gehört m.E. anders benannt z.B. roundfinancial()?.
Könnte es nicht sein, das dies in der Hardware der FPU steckt ?
Der Round-Modus wird über folgenden Befehl gesetzt. Und das sieht mit nach FPU-Register aus.
Code: Alles auswählen
procedure Set8087CW(cw:word);
begin
default8087cw:=cw;
asm
fnclex
fldcw cw
end;
end;
Verwendet dies nicht das normale FPC ?Und inzwischen bevorzuge ich CodeTyphon, weil es sich eben nicht so extrem um die Delphikompatibilität (oder besser Einschränkungen) schert und somit innovativ(er) sein kann
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 134
- Registriert: So 30. Nov 2008, 21:53
Re: Rundungsfehler ?
Richtig geraten, wie schon zum x-ten Male beschrieben. Und das hat Auswirkungen auf alle Fließkommaoperationen. Zum anderen bist Du praktisch völlig inkompatibel, mit Set8087CW bist Du auf Intel-32-Bit festgelegt. Selbst bei Win/64-Bit-Exes bringt das nix, da nicht 8087 sondern SSE verwendet wird.Mathias hat geschrieben:Könnte es nicht sein, das dies in der Hardware der FPU steckt ?
Der Round-Modus wird über folgenden Befehl gesetzt. Und das sieht mit nach FPU-Register aus.Code: Alles auswählen
procedure Set8087CW(cw:word); begin default8087cw:=cw; asm fnclex fldcw cw end; end;
Nochmal: Was hast Du gegen folgende Lösung?
Code: Alles auswählen
uses
math;
function myround(x: double): longint;
begin
if x >= 0 then myround := trunc(x+0.5)
else myround := -trunc(abs(x)+0.5)
end;
var
i,y,z: longint;
x: double;
begin
writeln('x':20, 'myround':12, 'round':12);
for i:=-10 to 10 do begin
x := 0.5*i;
y := myround(x);
z := round(x);
writeln(x:20:15, y:12, z:12);
end;
end.
Code: Alles auswählen
x myround round
-5.000000000000000 -5 -5
-4.500000000000000 -5 -4
-4.000000000000000 -4 -4
-3.500000000000000 -4 -4
-3.000000000000000 -3 -3
-2.500000000000000 -3 -2
-2.000000000000000 -2 -2
-1.500000000000000 -2 -2
-1.000000000000000 -1 -1
-0.500000000000000 -1 0
0.000000000000000 0 0
0.500000000000000 1 0
1.000000000000000 1 1
1.500000000000000 2 2
2.000000000000000 2 2
2.500000000000000 3 2
3.000000000000000 3 3
3.500000000000000 4 4
4.000000000000000 4 4
4.500000000000000 5 4
5.000000000000000 5 5
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Rundungsfehler ?
Doch im Moment schon, aber die basteln im Hintergrund wohl an einigen Sachen. Deswegen wurden auch die Projektdateien umbenannt.Mathias hat geschrieben:Verwendet dies nicht das normale FPC ?Und inzwischen bevorzuge ich CodeTyphon, weil es sich eben nicht so extrem um die Delphikompatibilität (oder besser Einschränkungen) schert und somit innovativ(er) sein kann
So hat sich Pilotlogic zumindest vor einiger Zeit mal geäußert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Beiträge: 206
- Registriert: Di 10. Nov 2009, 18:49
- OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
- CPU-Target: 32Bit/64bit
Re: Rundungsfehler ?
Es ist aber nicht nur Delphi, sondern auch die IEEE 754, die das so als Standard vorgibt. Damit sollte man das als Voreinstellung auch erwarten.MacWomble hat geschrieben:Ich finde es OK, wenn es ein Banker-Rounding gibt, aber bitte nicht als round(). round() sollte wirklich ab 0.5 aufrunden.
round() ist eine Basisfunktion und sollte sich demnach wie eine solche verhalten.
Das Banker-Rounding ist ein finanzmathematischer Sonderfall und gehört m.E. anders benannt z.B. roundfinancial()?.
Und wenn Delphi es tausend mal so macht, ich nutze Delphi nicht.![]()
Ich habe mich irgendwann für Lazarus entschieden, weil es eben nicht Delphi ist.
Und inzwischen bevorzuge ich CodeTyphon, weil es sich eben nicht so extrem um die Delphikompatibilität (oder besser Einschränkungen) schert und somit innovativ(er) sein kann.
MiSchi macht die fink-Pakete
Re: Rundungsfehler ?
Ich habe das wiki entsprechend überarbeitet: http://wiki.freepascal.org/Round/deindianer-frank hat geschrieben:]Ich warne dringend davor, SetRoundMode zu verwenden, wenn man nur ungefähr weiß, was damit eingestelllt wird. Alles außer Round-to-Nearest macht die FPC-Floatingpoint-Routinen (zB in math) oder andere noch sub-optimaler als sie eh schon sind, die Fehlerschranken pro Operation verdoppeln sich in etwa.
Wenn man unbedingt eine eigene Roundroutine haben will, kann man for positive x myround(x: real) = trunc(x + 0.5) verwenden (für negative x dann entsprechend auch das Negative)
-
- Beiträge: 134
- Registriert: So 30. Nov 2008, 21:53
Re: Rundungsfehler ?
Sieht gut aus, die Fomulierungen sind besser verständlich als meine.wp_xyz hat geschrieben: Ich habe das wiki entsprechend überarbeitet: http://wiki.freepascal.org/Round/de
-
- Beiträge: 6899
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Rundungsfehler ?
Ich habe für SetRoundMode noch ein kleine Wiki geschrieben: http://wiki.freepascal.org/SetRoundMode/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: 134
- Registriert: So 30. Nov 2008, 21:53
Re: Rundungsfehler ?
Ist allerdings wie schon die Originaldoku irreführend, da in der Beschreibung der FPU-Modi wieder nur das Runden nach Integer behandelt wird.Mathias hat geschrieben:Ich habe für SetRoundMode noch ein kleine Wiki geschrieben: http://wiki.freepascal.org/SetRoundMode/de
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Rundungsfehler ?
Guten Morgen zusammen,
Die Beschreibungnen im Wiki werden immer besser, danke Euch.
Wenn ich das jetzt richtig verstanden habe,
gibt es standardmäßg in FPC keine Rundungsfunktion wie ich sie mal gelernt habe ?
dazu muss man dann den Code wie wp_xyz geschrieben hat nutzen.
Bei mir wird "Float" angemeckert, das ewar ventuell nur "symbolisch" gemeint ?
Ich habe dafür ein Double eingesetzt, alles paletti.
Eigentlich feht dann im SetRoundMode
rmNormal oder rmSchool rmMiddle rmDrawing oder wie man das auch nennen mag.
Früher hieß das wohl kaufmännische oder bürgerliche Runden.
Fragt mal eure Eltern wie sie 3,5 runden würden. Die meistens sagen ab 0,5 nach oben.
Dann programmiert man in Pascal und es geht garnicht, man kann das nichtmal einstellen, das ist schon traurig....
Siro
Anmerkung: in "C" geht das aber auch nicht. hier gibt es wohl Ceil und Floor
floor : down to the nearest
ceil : up to the nearest
die normale Rundungsfunktion entspricht auch dem Banker Modell
Die Beschreibungnen im Wiki werden immer besser, danke Euch.
Wenn ich das jetzt richtig verstanden habe,
gibt es standardmäßg in FPC keine Rundungsfunktion wie ich sie mal gelernt habe ?
dazu muss man dann den Code wie wp_xyz geschrieben hat nutzen.
Bei mir wird "Float" angemeckert, das ewar ventuell nur "symbolisch" gemeint ?
Ich habe dafür ein Double eingesetzt, alles paletti.
Eigentlich feht dann im SetRoundMode
rmNormal oder rmSchool rmMiddle rmDrawing oder wie man das auch nennen mag.
Früher hieß das wohl kaufmännische oder bürgerliche Runden.
Fragt mal eure Eltern wie sie 3,5 runden würden. Die meistens sagen ab 0,5 nach oben.
Dann programmiert man in Pascal und es geht garnicht, man kann das nichtmal einstellen, das ist schon traurig....
Siro
Anmerkung: in "C" geht das aber auch nicht. hier gibt es wohl Ceil und Floor
floor : down to the nearest
ceil : up to the nearest
die normale Rundungsfunktion entspricht auch dem Banker Modell
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: Rundungsfehler ?
Ja, auch. Aber "Float" ist in der Unit Math deklariert, je nach System. Bei mir (Windows) Float = extended.siro hat geschrieben: Bei mir wird "Float" angemeckert, das war eventuell nur "symbolisch" gemeint ?
-
- Beiträge: 206
- Registriert: Di 10. Nov 2009, 18:49
- OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
- CPU-Target: 32Bit/64bit
Re: Rundungsfehler ?
Dass deine Eltern auf einem veralteten Stand der Dinge sind, kann man ihnen nicht verdenken, denn die IEEE hat die Rundung aus gutem Grund (positiver Bias) in den 80igern oder 90igern so festgelegt und offensichtlich mussten deine Eltern nicht umlernen. Ich denke, dass die meisten sich zunächst einmal daran stören, dass es nicht so ist, wie man es damals in der Schule gelernt hat. Wer tatsächlich eine andere Rundung braucht, muss halt den Rundungsmodus setzen oder selber Hand anlegen, wenn das nicht reicht. Genau dafür wurde man doch ausgebildet. Für ein technisch/naturwissenschaftlich ausgerichtetes Forum zeigen einige einen überraschenden Widerstand an den Tag, wenn es darum geht, neues zu akzeptieren. Der positive Bias beim immer nach oben Runden ist doch ein guter Grund, das so zu lösen.siro hat geschrieben:Fragt mal eure Eltern wie sie 3,5 runden würden. Die meistens sagen ab 0,5 nach oben.
Dann programmiert man in Pascal und es geht garnicht, man kann das nichtmal einstellen, das ist schon traurig....l
MiSchi macht die fink-Pakete