Autor Beitrag
Dietmar1961
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 24.05.06 16:30 
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.


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 24.05.06 17:07 
Bzw. IsZero verwenden

AXMD
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: 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: