Rundungsfehler ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Re: Rundungsfehler ?

Beitragvon Mathias » 30. Mai 2018, 15:33 Re: Rundungsfehler ?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 30. Mai 2018, 15:42 Re: Rundungsfehler ?

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)
indianer-frank
 
Beiträge: 133
Registriert: 30. Nov 2008, 21:53

Beitragvon Mathias » 30. Mai 2018, 15:50 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. :roll:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MacWomble » 30. Mai 2018, 18:26 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. :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.
MacWomble
 
Beiträge: 607
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Mathias » 30. Mai 2018, 19:11 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()?.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 30. Mai 2018, 19:51 Re: Rundungsfehler ?

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
indianer-frank
 
Beiträge: 133
Registriert: 30. Nov 2008, 21:53

Beitragvon MacWomble » 30. Mai 2018, 20:30 Re: Rundungsfehler ?

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.
MacWomble
 
Beiträge: 607
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon mischi » 31. Mai 2018, 09:28 Re: Rundungsfehler ?

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
mischi
 
Beiträge: 205
Registriert: 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon wp_xyz » 31. Mai 2018, 10:42 Re: Rundungsfehler ?

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
wp_xyz
 
Beiträge: 2672
Registriert: 8. Apr 2011, 08:01

Beitragvon indianer-frank » 31. Mai 2018, 11:01 Re: Rundungsfehler ?

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.
indianer-frank
 
Beiträge: 133
Registriert: 30. Nov 2008, 21:53

Beitragvon Mathias » 31. Mai 2018, 17:02 Re: Rundungsfehler ?

Ich habe für SetRoundMode noch ein kleine Wiki geschrieben: http://wiki.freepascal.org/SetRoundMode/de
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 31. Mai 2018, 17:27 Re: Rundungsfehler ?

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.
indianer-frank
 
Beiträge: 133
Registriert: 30. Nov 2008, 21:53

Beitragvon siro » 1. Jun 2018, 06:46 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
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
siro
 
Beiträge: 315
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 1. Jun 2018, 08:43 Re: Rundungsfehler ?

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.
wp_xyz
 
Beiträge: 2672
Registriert: 8. Apr 2011, 08:01

Beitragvon mischi » 1. Jun 2018, 08:48 Re: Rundungsfehler ?

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
mischi
 
Beiträge: 205
Registriert: 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x | 
CPU-Target: 32Bit/64bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
VorherigeNächste

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried