Hallo,
Handelt es sich bei Trunc um einen Fehler, oder gibt es eine gute Erklärung:
Delphi-Quellcode:
procedure Test;
var a, b, e1, e2, e3, e4: Double; // mit Single immer OK ???
begin
a := 0.1;
b := 1 / a;
e1 := Trunc (b); // e1 = 10 OK
e2 := Trunc (1 / a); // e2 = 9 falsch
e3 := Trunc (RoundTo(1 / a, -14)); // e3 = 10 OK
e4 := Trunc (RoundTo(1 / a, -15)); // e4 = 9 falsch
Assert (e1 = 10);
Assert (e2 = 10); // Abbruch durch Assertion
Assert (e3 = 10);
Assert (e4 = 10); // Abbruch durch Assertion
end;
Natürlich ist mir klar, dass es Rundungsfehler gibt und Trunc diese dann ungünstig abschneiden kann. So ist z.B. (5 - 2 x Resolution) ja 4 und nicht 5. In Test erkennt man, dass der Rundungsfehler zwischen der 14 und 15 Stelle hinter dem Komma entsteht. Soweit ja OK.
Aber wieso ist e1 richtig und e2 falsch, da hier doch lediglich eine lokale Kopie eines berechneten Wertes anstatt der berechnete Wert selber genutzt wird? Und warum funktioniert das alles bei Single einwandfrei?
Vielen Dank.