Forum: Programmieren allgemein
by Michael II,
10. Okt 2023
Für extended kannst du das Epsilon so addieren:
function plusepsilone(e : extended):extended;
var h : System.TExtended80Rec absolute e;
begin
h.Frac := h.Frac+1;
Result := e;
end;
(Hinweis: Prüft nicht, ob h.frac maximal = 1111.....111 ist.)
Forum: Programmieren allgemein
by Michael II,
8. Okt 2023
Hoi mmw,
das Problem bleibt. Wenn ein Dezimalbruch eine unendlich binäre Darstellung hat (also binär irgend ein periodischer Bruch ist), dann kannst du den dezimalen Wert binär mit den Formaten single, double, extended nicht genau abspeichern. Das System kann nur die nächstkleinere oder nächstgrössere (durch das Format (extended) vorgegebene) mögliche Zahl abspeichern. (siehe weiter oben)
In...
Forum: Programmieren allgemein
by Michael II,
8. Okt 2023
Du schreibst, die Lösung sei auf das Problem zugeschnitten. Dafür gebe ich dir 100 Punkte ;-). Eine Lösung sollte auf die gestellte Aufgabe zugeschnitten sein. Die vorher angegebenen Vorschläge lieferten zwischen 123.000000 und 123.999999 in mindestens 496 Fällen nicht das korrekte Resultat.
Mit Willkür hat das nix zu tun. Aber du hast Recht, das ist 1. Semster Informatik Stoff und hat mit...
Forum: Programmieren allgemein
by Michael II,
8. Okt 2023
Es darf für positive Zahlen nie minusepsilon sein:
Wenn ein Dezimalbruch binär periodisch ist, dann wird das System beim Speichern von double wahrscheinlich entweder aufrunden, wenn das 53ste Bit=1 ist oder aber ab Bit 53 abschneiden (und damit abrunden). Das System speichert also entweder z1<z oder z2>z. Im Intervall ]z1,z2
Es gibt also 2 Fälle.
1. Das System hat abgeschnitten oder...
Forum: Programmieren allgemein
by Michael II,
8. Okt 2023
Double Zahlen sind etwas gefährlich. Die Mantisse bei double ist 52 Bits gross. Wenn ein Dezimalbruch binär geschrieben unendlich viele Stellen hat, dann kann die Mantisse mit ihren 52 Bits unendlich viele der 1en nicht aufnehmen.
Beispiel 0.1(10) ist binär geschrieben periodisch 0.000110011001100....(2) mit Periode 1100. D.h. die Dezimalzahl 0.1 lässt sich als double nicht genau abspeichern....