Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rundungsfehler bei Float Addition/Subtraktion (https://www.delphipraxis.net/73177-rundungsfehler-bei-float-addition-subtraktion.html)

mgero 13. Jul 2006 11:21


Rundungsfehler bei Float Addition/Subtraktion
 
Hallo Zusammen,

Das Rundungsprobleme im Zusammenhang mit Float auftreten können, ist ja bekannt.
Normale Additionen oder Subtraktionen sollten jedoch kein Problem sein.

Mit Delphi 6 ergibt folgenden Operation mit Double nicht 0

Delphi-Quellcode:
var
  xDouble  : Double;
begin
  xDouble := 0;
  xDouble := xDouble + 3743.8;
  xDouble := xDouble - 3743.8;
Verwendet man anstelle von Double Extended, ist das ganze noch merkwürdiger: Hier bekommt man 0, solange keine Datenbank mit TDatabase angesprochen wird, danach kommt der gleiche Fehler. Das bedeutet, das die gleiche Funktion nach dem ersten Datenbank- Connect ein anderes Ergebnis liefert als davor.

Natürlich kann ich einen Workaround basteln, z.B alle Werte Runden vor Prüfung auf 0,
mir gefällt jedoch nicht wenn das System so unzuverlässig rechnet.

Kennt jemand eine Lösung zum Problem, eventuell eine Compilerdirektive o.a.

Vielen Dank

xaromz 13. Jul 2006 11:48

Re: Rundungsfehler bei Float Addition/Subtraktion
 
Hallo,
Zitat:

Zitat von mgero
Normale Additionen oder Subtraktionen sollten jedoch kein Problem sein.

Das ist leider falsch. Das Problem ist, dass ein Computer
- im Dualsystem arbeitet
- nicht beliebig viele Dezimalstellen speichern kann
Im Dualsystem haben reele Zahlen oft keine exakte Entsprechung zu Zahlen im Dezimalsystem. Es geht also Genauigkeit durch das unterschiedliche Zahlensystem verloren (Siehe "nicht beliebig viele Nachkommastellen"). Zusätzlich ist die Genauigkeit der Zahl im Computer von der Größe der Zahl abhängig: Je größer eine Zahl ist (absolut), desto weniger Nachkommastellen können dargestellt werden.

Gruß
xaromz

himitsu 13. Jul 2006 12:46

Re: Rundungsfehler bei Float Addition/Subtraktion
 
Und außerdem sollte man reelle Zahlen nie auf Gleichheit prüfen ... wegen der angesprochenen "Rundungsfehler".

Also nie
Delphi-Quellcode:
if x = 0 then ...
// oder
if x = 123.4594 then ...
auf null kann man z.B. so prüfen:
Delphi-Quellcode:
if abs(x) < 0.00001{jenachdem wie genau es sein soll} then ...

mgero 13. Jul 2006 14:06

Re: Rundungsfehler bei Float Addition/Subtraktion
 
Ich auch noch ein bisschen recherchiert. Da gibt es in der Math.pas
die Funktionen CompareValue, SameValue und IsZero für Float vergleiche.
Ich frage mich wieso es dann die Operatoren =, <, > usw. gibt, wenn man
sie nicht gebrauchen kann. Der Compiler könnte das ja auch handeln.

Vielen Dank und Gruss,

mgero

himitsu 13. Jul 2006 14:46

Re: Rundungsfehler bei Float Addition/Subtraktion
 
Mann kann diese ja benutzn (vorallem bei < und > ist es doch nicht schlimm) ... man muß halt nur wissen was man macht, wenn man z.B. = verwendet und eben einige Dinge beachten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz