Rundungsfehler ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
mschnell
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 ?

Beitrag von mschnell »

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

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

-Michael

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

Beitrag von mschnell »

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

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

Re: Rundungsfehler ?

Beitrag von indianer-frank »

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.

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

Beitrag von mschnell »

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

Antworten