Rundungsfehler ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Re: Rundungsfehler ?

Beitragvon mschnell » 5. Jun 2018, 09:10 Re: Rundungsfehler ?

indianer-frank hat geschrieben: Literale werden anders als Variable behandelt

Anscheinend wird das Round() wegoptimiert... und die Optimierung ist fehlerhaft.

-Michael
mschnell
 
Beiträge: 3216
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon mschnell » 5. Jun 2018, 09:12 Re: Rundungsfehler ?

siro hat geschrieben:Man konnte früher sogar in den Optionen einstellen ob der Coprozessor benutzt werden soll oder die Emulation,
ich weis garnicht ob die Rundungsergebnisse dann unterschiedlich waren. Habe leider kein Turbo Pascal mehr.


Wäre natürlich hübsch, das auch noch zu testen...
-Michael
mschnell
 
Beiträge: 3216
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon indianer-frank » 5. Jun 2018, 09:44 Re: Rundungsfehler ?

mschnell hat geschrieben:
siro hat geschrieben:Man konnte früher sogar in den Optionen einstellen ob der Coprozessor benutzt werden soll oder die Emulation,
ich weis garnicht ob die Rundungsergebnisse dann unterschiedlich waren. Habe leider kein Turbo Pascal mehr.

Wäre natürlich hübsch, das auch noch zu testen...
-Michael

Keine Unterschiede bei {$n+,e-} (bis auf die Tatsache das TP4 kein {$e-} kennt)
Code: Alles auswählen
D:\DMX\TP4>TPC.EXE T_RND.PAS
Turbo Pascal  Version 4.0  Copyright (c) 1987 Borland International
T_RND.PAS(1): Error 17: Invalid compiler directive.
{$N+,E-}
     ^ 
Für {$n-} weigern sich alle Compiler die Zuweisungen x:=0.5 etc zu übersetzen
Code: Alles auswählen
D:\DMX\TP4>TPC.EXE T_RND.PAS
Turbo Pascal  Version 4.0  Copyright (c) 1987 Borland International
T_RND.PAS(19): Error 116: Must be in 8087 mode to compile this.
  x := 0.5;  l:= round(x); writeln(l);
          ^ 
Für {$n-} und Test via Literale liefern alle 1 2 3 4, d.h. nur TP4 verändert sein Verhalten.

Edit: Um der nächsten Frage schon mal vorzubeugen. Ändert man den Typ zum Borland-Spezial-Softtyp real (d.h. var x: real;), können beide Tests übersetzt werden, und das Ergebnis ist in allen Fällen 1 2 3 4.
indianer-frank
 
Beiträge: 132
Registriert: 30. Nov 2008, 21:53

Beitragvon mschnell » 5. Jun 2018, 11:43 Re: Rundungsfehler ?

Super !

Also moderne Hardware macht Banker-Runden.

Die Soft-Real-Library des alten Compilers macht "intuitives" Runden.

Wie gesagt, wer sich auf den genauen Wert einer reellen Variable verlässt, ist verlassen. Alle Reals sind nur bis auf eine gewisse Genauigkeit gültig.

Kleine Ausnahme vermutlich bei ganzen Zahlen: unterhalb einer gewissen Grenze: Umwandlung einer solchen von integer nach Real und direkt wieder zurück (also trunc()) wird das erwartete ergeben.

P.S.:
Ich arbeite viel mit einer Sprache "EEL2". Da gibt es keine integers. Vergleich von Zahlen mit dem Operator "==" wird da immer +/- einer Genauigkeit durchgeführt. Will man auf bitweise Gleichheit testen, muss man den "===" Operator verwenden.

-Michael
mschnell
 
Beiträge: 3216
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

• Themenende •
Vorherige

Zurück zu Freepascal



Wer ist online?

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

porpoises-institution
accuracy-worried