![]() |
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:
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.
var
xDouble : Double; begin xDouble := 0; xDouble := xDouble + 3743.8; xDouble := xDouble - 3743.8; 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 |
Re: Rundungsfehler bei Float Addition/Subtraktion
Hallo,
Zitat:
- 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 |
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:
auf null kann man z.B. so prüfen:
if x = 0 then ...
// oder if x = 123.4594 then ...
Delphi-Quellcode:
if abs(x) < 0.00001{jenachdem wie genau es sein soll} then ...
|
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 |
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