Rundungsfehler ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Rundungsfehler ?

Beitrag von Mathias »

mschnell hat geschrieben:
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

Nur löst keine dieser Optionen das Problem mit den x.5 . Siehe ersten Post.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Rundungsfehler ?

Beitrag von indianer-frank »

mschnell hat geschrieben:
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
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)

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Rundungsfehler ?

Beitrag von Mathias »

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. :roll:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MacWomble
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 ?

Beitrag von MacWomble »

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. :twisted:

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. :oops:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Rundungsfehler ?

Beitrag von Mathias »

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()?.

Dieser Meinung bin ich auch.

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;


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
Verwendet dies nicht das normale FPC ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Rundungsfehler ?

Beitrag von indianer-frank »

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;


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.

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

MacWomble
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 ?

Beitrag von MacWomble »

Mathias hat geschrieben:
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
Verwendet dies nicht das normale FPC ?


Doch im Moment schon, aber die basteln im Hintergrund wohl an einigen Sachen. Deswegen wurden auch die Projektdateien umbenannt.
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.

mischi
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 ?

Beitrag von mischi »

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. :twisted:

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. :oops:

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.
MiSchi macht die fink-Pakete

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Rundungsfehler ?

Beitrag von wp_xyz »

indianer-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)

Ich habe das wiki entsprechend überarbeitet: http://wiki.freepascal.org/Round/de

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Rundungsfehler ?

Beitrag von indianer-frank »

wp_xyz hat geschrieben:Ich habe das wiki entsprechend überarbeitet: http://wiki.freepascal.org/Round/de
Sieht gut aus, die Fomulierungen sind besser verständlich als meine.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Rundungsfehler ?

Beitrag von Mathias »

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

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Rundungsfehler ?

Beitrag von indianer-frank »

Mathias hat geschrieben:Ich habe für SetRoundMode noch ein kleine Wiki geschrieben: http://wiki.freepascal.org/SetRoundMode/de

Ist allerdings wie schon die Originaldoku irreführend, da in der Beschreibung der FPU-Modi wieder nur das Runden nach Integer behandelt wird.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Rundungsfehler ?

Beitrag von siro »

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
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Rundungsfehler ?

Beitrag von wp_xyz »

siro hat geschrieben:Bei mir wird "Float" angemeckert, das war eventuell nur "symbolisch" gemeint ?

Ja, auch. Aber "Float" ist in der Unit Math deklariert, je nach System. Bei mir (Windows) Float = extended.

mischi
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 ?

Beitrag von mischi »

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

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.
MiSchi macht die fink-Pakete

Antworten