Da liegt der Hase (Hund?) begraben. Du darfst normalerweise zwei Floats nicht direkt vergleichen, sondern musst in der Regel einen Toleranzwert berücksichtigen. In der Math-Unit gibt es ein SameValue(x, y, Eps). Statt "if x = y" würde ich schreiben "if SameValue(x, y, 1e-9)" - das gibt immer true zurück, solange x und y sich um nicht mehr als 1E-9 unterscheiden. Der Toleranzwert von 1E-9 ist relativ groß im Vergleich zur Grundgenauigkeit von Double und Extended, aber die Rundungsfehler können sich je nach Rechnung und Größenordnung des Ergebnisses leicht vergrößern; in der Regel komme ich damit gut zurecht.Niesi hat geschrieben: Sa 6. Jul 2024, 16:34 Da aber delta = 0.0200000000000001 und delta_up = 0.0199999999999999
als Ergebnis geliefert werden, ist beim Vergleich delta_up kleiner als delta.
Für die anderen Vergleiche würde ich mir Funktionen schreiben:
Code: Alles auswählen
function LessThan(x, y, Eps: float): Boolean;
begin
if SameValue(x, y, Eps) then
Result := false
else
Result := x < y;
end;
function LessEqual(x, y, Eps: float): Boolean;
begin
if SameValue(x, y, Eps) then
Result := true
else
Result := x < y;
end;
// analog: GreaterThan und GreaterEqual