Entwickler-Ecke
Sonstiges (Delphi) - Verständnisfrage Vergleich von Float und Extended
Dietmar1961 - Mi 24.05.06 16:30
Titel: Verständnisfrage Vergleich von Float und Extended
Hallo zusammen
ich habe da mal eine Frage zum Vergleich unterschiedlicher Datentypen z.Bsp. Double mit Extended.
Habe ein kurzes Codefragment beigelegt, aus dem ich (und meine Progarmmierkollegen) nicht schlau werden. Vielleicht kann das ja einer erklären. Ist auf jeden Fall eine böse Fussangel.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var x: double; y: extended; begin x := 0.1; y := 0.1;
if StrToFloat('0,1') = x then showmessage('gleich') else showmessage('ungleich');
if x <> y then showmessage('x<>y'); end; |
Im angegebenen Beispiel kommt immer ungleich raus?????
:?: :?: :?: :?:
Woran liegt das
Danke schonmal vorab für die Beantwortung dieser Frage.
Nebenbei ein grosses Lob an die Betreiber dieses Forums.
aim65 - Mi 24.05.06 16:40
das ist offensichtlich ein kleines Demoprogramm, um die unvermeidlichen internen Rundungsfehler bei Floating-Point Zahelen zu zeigen. "0,1" kann nie exakt im Rechner dargestellt werden.
Weise doch mal "0,1" x (Double) und y (Extended) zu und guck dir das ergebnis mit "Label1.Caption := FloatToStr(x)", bzw.(y) an. Kommt irgendwas mit 0,0999999.... oder so heraus. das Programm zeigt nur die Fehlermöglichkeit bei Vergleichen auf - immer ne schöne Falle.
Extended hat eine höhere Stellenzahl (Genauigkeit der Mantisse) als Double, daher wird bei "if x<>y" immer die Message "x<>y" kommen.
Dietmar1961 - Mi 24.05.06 16:55
Titel: Bei mir nicht
Danke für die Antwort. Habe das natürlich gleich mal ausprobiert jedoch kommt bei mir in beiden Fällen 0,1 raus??
aim65 - Mi 24.05.06 17:05
:shock: Hast recht, habs gerade mal ausprobiert - die floattostr-Routine scheint das wieder zu korrigieren.
Aber mach folgendes: label1.caption :=floattostr(x-y)
Da kommt 5,5497598704101 e-18 heraus. Das ist der Unterschied zwischen Double und Extended wegen der unterschiedlichen Genauigkeit und ist eben NICHT Null.
Daher: Nie Floating-Point Zahlen direkt auf Gleichheit prüfen!
AXMD - Mi 24.05.06 17:07
Bzw. IsZero verwenden
AXMD
aim65 - Mi 24.05.06 17:18
@AXMD: Jau, guter Tip. 8) Ich verwende bei meinen Berechnungen im HF-Bereich gerne Toleranzgrenzen wie: "if abs(x-y) <1e-5" wegen der ohnehin begrenzten physikalischen Genauigkeiten. :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!