AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Rundungsfehler bei Float Addition/Subtraktion
Thema durchsuchen
Ansicht
Themen-Optionen

Rundungsfehler bei Float Addition/Subtraktion

Ein Thema von mgero · begonnen am 13. Jul 2006 · letzter Beitrag vom 13. Jul 2006
Antwort Antwort
mgero

Registriert seit: 26. Jun 2006
5 Beiträge
 
Delphi 6 Enterprise
 
#1

Rundungsfehler bei Float Addition/Subtraktion

  Alt 13. Jul 2006, 11:21
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
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Rundungsfehler bei Float Addition/Subtraktion

  Alt 13. Jul 2006, 11:48
Hallo,
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Rundungsfehler bei Float Addition/Subtraktion

  Alt 13. Jul 2006, 12:46
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:
if abs(x) < 0.00001{jenachdem wie genau es sein soll} then ...
$2B or not $2B
  Mit Zitat antworten Zitat
mgero

Registriert seit: 26. Jun 2006
5 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Rundungsfehler bei Float Addition/Subtraktion

  Alt 13. Jul 2006, 14:06
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Rundungsfehler bei Float Addition/Subtraktion

  Alt 13. Jul 2006, 14:46
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz