Einzelnen Beitrag anzeigen

Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#26

AW: Single wert ist unterschiedlich obwohl gleich

  Alt 18. Jun 2018, 16:48
Im übrigen will ich Dich von Deiner festgefaßten Meinung nicht abbringen, und sehe die Sache hier als erledigt an.
Darum geht es ja gar nicht. Ich will dich auch nicht von deiner Meinung abbringen. Aber viele sind schon auf diese Sache reingefallen. Und das hat nichts mit Blödheit zu tun.

Es gibt auch viele die mitlesen. Und wenn du schreibst, dass das direkte Vergleichen zweier Gleitkommazahlen kein Problem ist, dann führst du diese Leute auf's Glatteis.


Beispiel:

Delphi-Quellcode:
var
  value1: double;
  value2: double;
begin
  value1 := 1.23;
  value2 := 1.23;
  writeln(value1); // 1.23000000000000E+0000 -> Debugger zeigt 1.23 an
  writeln(value2); // 1.23000000000000E+0000 -> Debugger zeigt 1.23 an
  writeln(value1 = value2); // True
  value1 := sqrt(value1);
  writeln(value1); // 1.11905365064094E+0000
  value1 := Sqr(value1);
  writeln(value1); // 1.23000000000000E+0000 -> Debugger zeigt 1.23 an
  writeln(value1 = value2); // False -> Aber der Debuger zeigt für Value1 und Value2 den Wert 1.23 an. Suchst du dir halt den Wolf ;-)
  writeln(samevalue(value1 , value2)); //True
  value1 := value1-value2;
  writeln(value1); -2.22044604925031E-0016 // Erst hier fällt auf, dass es einen minimalen (ab der 16. Kommastelle) Unterschied gibt
  writeln(value1 = 0); // False
  writeln(IsZero(value1)); // True
  readln;
end.
Hier gibt der direkte Vergleich der Zahlen ein "False"


Anderes Beispiel:

Delphi-Quellcode:
var
  value1: double;
  value2: double;
begin
  value1 := 4;
  value2 := 4;
  writeln(value1); // 4.00000000000000E+0000
  writeln(value2); // 4.00000000000000E+0000
  writeln(value1 = value2); // True
  value1 := sqrt(value1);
  writeln(value1); // 2.00000000000000E+0000
  value1 := Sqr(value1);
  writeln(value1); // 4.00000000000000E+0000
  writeln(value1 = value2); // True
  writeln(samevalue(value1 , value2)); //True
  value1 := value1-value2;
  writeln(value1); // 0.00000000000000E+0000
  writeln(value1 = 0); // True
  writeln(IsZero(value1)); // True
  readln;
end.
Hier gibt der direkte Vergleich "True"

Für mich ein inkonsistentes Verhalten, was aber logisch ist wenn man die Internas berücksichtigt. Dennoch ist dieses Verhalten meist nicht gewünscht und mit "SameValue" kann man dies durch berücksichtigen des Epsilon umgehen
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat