AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Fließkommazahlen auf Gleichheit prüfen

Fließkommazahlen auf Gleichheit prüfen

Ein Thema von Luckie · begonnen am 12. Nov 2006 · letzter Beitrag vom 3. Mai 2009
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 13. Nov 2006, 14:02
Ich denke es liegt eher daran das der Compiler optimiert und schon die richtigen Werte einsetzt.
Wenn du die Optimierung abschaltest und das ganze über Zwischenvariablen zuweist hast du eventuell mehr Glück.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 13. Nov 2006, 14:04
Die Optimierung hatte cih versuchsweise schon mal abgeschaltet, hat aber auch nichts genützt. Aber wiedem auch sein, ein Beispiel in C tut es auch. Man ist ja flexibel und ist in der Lage sich seine Programmiersprache der Aufgabe entsprechend auszusuchen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 14. Nov 2006, 00:22
So, Artikel ist fertig:

Artikel: Prüfe Fließkommazahlen nie auf Gleichheit!

Abstract
Probleme beim Vergleichen von Fließkommazahlen. Es ist ein beliebter Anfängerfehler, auch wenn ihn hin und wieder auch mal Programmierer machen, die es wissen sollten, weil sie eigentlich über das nötige Hintergrundwissen verfügen (sollten). Und zwar der Vergleich von Fließkommazahlen auf Gleichheit. Was ist daran so gefährlich und warum funktioniert es eben nicht immer?

Link: Prüfe Fließkommazahlen nie auf Gleichheit!

Und im Anhang das endgültige PFD.
Angehängte Dateien
Dateityp: pdf vergleichfliesskommazahlen_162.pdf (82,3 KB, 26x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 14. Nov 2006, 08:18
Luckie: So ist es eindrucksvoller, da der oft verwendete Vergleich mit 0 schon hier in die Hose geht.
Delphi-Quellcode:
Var
  a,b : Double;

begin
  a := 0.1;
  b := a - 0.1;
  if b=0 then
    ShowMessage('gleich')
  else
    ShowMessage ('ungleich');
end;
Der Grund ist klar: 0.1 lässt sich mit Floating Point nun mal nicht 100% genau darstellen, ergo ist 0.1f <> -(-0.1)f. Folgerichtig funktioniert aber das hier (weil typisierte Konstanten mit Variablen gleichzusetzen sind):
Delphi-Quellcode:
Const
  C : Double = 0.1;
Var
  a,b : Double;

begin
  a := C;
  b := a - C;
  if b=0 then
    ShowMessage('gleich')
  else
    ShowMessage ('ungleich');
end;
Aber das hier wiederum nicht
Delphi-Quellcode:
Const
  C = 0.1;
Var
  a,b : Double;

begin
  a := C;
  b := a - C;
  if b=0 then
    ShowMessage('gleich')
  else
    ShowMessage ('ungleich');
end;
Weil Konstanten per definitionem nur Platzhalter sind.

Fazit: Man kann sich einfach nicht darauf verlassen, das "wo 0 draufsteht auch 0 drin ist".

[edit=sakura] BB-Code aktiviert. Mfg, sakura[/edit]


[edit] C in den Code eingefügt, danke Sir Thornberry[/edit]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 14. Nov 2006, 12:27
wo ist jetzt der unterschied? C wird in beiden Fällen definiert aber nirgends verwendet
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#16

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 14. Nov 2006, 12:39
und deswegen auch:
Delphi-Quellcode:
While Time < StrToTime ('09:30') Do
  Alzaimar.CanPostImForum := False
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Sourcemaker
Sourcemaker

Registriert seit: 3. Sep 2003
Ort: Westoverledingen
264 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 14. Nov 2006, 12:44
Hallo Luckie,

ich habe gerade Deinen Artikel gelesen und mir fehlt die Erwähnung des Typs Currency,
den benutze ich immer um entsprechende Vergleichsfehler auszuschließen.

Grüße

Frank
Frank
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#18

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 14. Nov 2006, 12:50
Currency hat 4 feste Nachkommastellen. Es handelt sich eigentlich um einen 64bit Integer Wert, also um (z.B.) 10000stel Cent.

Mit 4 Nachkommastellen kommt man aber auch nicht weit. Die richtige Vorgehensweise beim Rechnen mit reelen Zahlen ist entweder die Verwendung von Schutzstellen, oder die Verwendung von BCD-Datentypen. Diese sind aber nicht Bestandteil von Delphi.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Sourcemaker
Sourcemaker

Registriert seit: 3. Sep 2003
Ort: Westoverledingen
264 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 14. Nov 2006, 13:14
alzaimar:
Zitat:
Currency hat 4 feste Nachkommastellen. Es handelt sich eigentlich um einen 64bit Integer Wert, also um (z.B.) 10000stel Cent.

Mit 4 Nachkommastellen kommt man aber auch nicht weit. Die richtige Vorgehensweise beim Rechnen mit reelen Zahlen ist entweder die Verwendung von Schutzstellen, oder die Verwendung von BCD-Datentypen. Diese sind aber nicht Bestandteil von Delphi.
Für die vielen mit Delphi realisierten kaufmännischen Anwendungen und viele andere, die nicht gerade astronomische Zahlen vorausetzen, ist es aber eine gute Lösung.

Grüße

Frank
Frank
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#20

Re: Fließkommazahlen auf Gleichheit prüfen

  Alt 14. Nov 2006, 13:22
Zitat von Sourcemaker:
...
Für die vielen mit Delphi realisierten kaufmännischen Anwendungen und viele andere, die nicht gerade astronomische Zahlen vorausetzen, ist es aber eine gute Lösung....
Kaufmännische Anwendungen implizieren ja geradezu Currency, schließlich geht es ja ums Geld.

Eine Anwendung von uns berechnet Materialmengen, und da reicht Single z.B. schon gar nicht mehr aus. Die Berechnungen gehen über viele Iterationen und gerade hier potzenzieren sich Rundungsfehler. Wir arbeiten mit Double (das ist dann knapp ausreichend) und zeigen dann maximal 4 Nachkommastellen an. Gerade Iterationen benötigen verdammt viele Schutzstellen.

Die Anwendung (und auch die Zahlen) ist übrigens irdisch .

Eigentlich benötigen fast alle mathematischen Anwendungen, die sich nicht nur aufs Addieren beschränken, eine höhere Genauigkeit (Anzahl der Stellen), als sie Currency bietet.

Dafür ist Currency eben 100% genau. Bei Addition und Subtraktion. Und da sind 0.1 Euro - 0.1 Euro garantiert = 0,0000!
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:12 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