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: