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