![]() |
AW: Nur x Nachkommastellen von Float
Zitat:
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 deinem Fall treten zum Beispiel zwischen 99.000001 und 99.999999 natürlich wiederum die "gleichen" 496 Probleme auf. U.a. wird für GetDigitsNeu( 99.101000, 3 ).ToString) 100 ausgegeben. Dies geschieht auch, wenn du die von dir vorgeschlagene Konversion nach real (als double implementiert) weglässt und mit extended rechnest. Extended erlaubt dir lediglich eine grössere Stellengenauigkeit als double. |
AW: Nur x Nachkommastellen von Float
Für extended kannst du das Epsilon so addieren:
Delphi-Quellcode:
(Hinweis: Prüft nicht, ob h.frac maximal = 1111.....111 ist.)
function plusepsilone(e : extended):extended;
var h : System.TExtended80Rec absolute e; begin h.Frac := h.Frac+1; Result := e; end; |
AW: Nur x Nachkommastellen von Float
Das geht dann aber auch etwas schlanker:
Delphi-Quellcode:
Könnte man auch noch als
uses
System.Sysutils; ... function plusepsilone(const e : extended):extended; begin Result := e; Result.Frac := Result.Frac+1; end;
Delphi-Quellcode:
deklarieren.
inline
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz