![]() |
Delphi-Version: 2010
Präzision von Variants und Flieskommazahlen
Hallo Zusammen,
Ich musste eben etwas schockiert festellen, dass Werte an Genauigkeit einbüssen, wenn sie von einem Extended einem Variant zugewiesen wird:
Delphi-Quellcode:
Was rauskommt ist: Nicht gleich. Fehler bei 1E-12
procedure TForm1.Button1Click(Sender: TObject);
var Msg: String; Precision: Extended; Original: Extended; Epsilon: Extended; E: Extended; V: Variant; begin Original := 12345.6789; E := Original; V := E; E := V; if Original = E then begin Msg := 'Genau gleich.'; end else begin Precision := 1e-20; while not SameValue(Original, E, Precision) do Precision := Precision * 10; Msg := 'Nicht gleich. Fehler bei ' + FloatToStr(Precision); end; ShowMessage(Msg); end; Das ist irgendwie alles andere als erfreulich - zumal ich ja noch nicht einmal damit gerechnet habe. Ist das etwas bekanntes? Kann man das irgendwie flicken? |
AW: Präzision von Variants und Flieskommazahlen
Der Typ Variant kennt nur maximal Double.
Siehe System.TVarData ... da erkennst du alle möglichen Typen. Wenn du mehr willst, dann könntest du dir höchstens einen eigenen neuen Variant-Typen erstellen und über die Unit Variants registrieren. Der neue Typ wird dann aber nur von deinem Delphi-Programm komplett und in vollem Umfang verstanden (externe Programme/DLLs/Codes würden dann. über einen von dir erstellten Konverter auch nur kleinere Auflösungen verstehen können). PS: Angeblich soll in zukünftigen Delphi-Versionen Extendet nicht mehr offiziell unterstützt werden, sondern nur noch für interne Berechnungen diehnen ... Single, Double und Currency wären damit die offiziell nutzbaren (Fließkomma)-Typen. |
AW: Präzision von Variants und Flieskommazahlen
Danke für die Antwort, das erklärt einiges.
Mit Double scheint alles zu klappen. Das mit dem eigenen Variant-Type behalte ich mal im Hinterkopf, im Moment genügt mir doppelte genauigkeit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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