![]() |
Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Ich möchte eine Fließkommazahl mit TIniFile.WriteFloat abspeichern und egal welchen Typ ich nehme (extended, single, double, real) wird, wenn ich eine 1 speichere, ein wilder Wert der Form 0,99999999987542 abgelegt.
Beim Laden und anschließenden Test auf 1 schlägt es natürlich fehl. Da 0,99999999987542 nunmal nicht 1 ist. Wo liegt mein Denkfehler hier? Vielen Dank schonmal und Happy Halloween! |
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Hallo,
Egal welchen Typ ich verwende, es wird immer eine 1 in die INI geschrieben.
Delphi-Quellcode:
uses
IniFiles; procedure TForm1.Button1Click(Sender: TObject); var ini: TIniFile; i: Real; // od. Integer/Double etc. begin ini := TIniFile.Create('c:\test.ini'); try i := 1; ini.WriteFloat('Section', 'Name', i); finally ini.Free; end; end; |
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Zitat:
Fehler 2: Du vergleichst auf Gleichheit. Das sollte man mit Gleitkommazahlen nie machen. Du kannst entweder Festkommazahlen hernehmen (wie z.B. Currency) oder du vergleichst mit einer Toleranz von +- 10^-6 oder sowas. |
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Danke! Currency löst das Problem sehr elegant!
|
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Zitat:
|
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Er unterschlägt uns wohl noch einen Operation vorm Speichern, die zur binären Ungenauigkeit führt.
Ist ja auch nicht klar, wie genau (mit 1) verglichen werden muss, ein Round() könnte schon reichen. €: Seine Antwort übersehen: Wenn ihm der Nachkommabereich von Currency reicht, ist das natürlich auch Ok. |
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Wahrscheinlich stammt der Wert aus einer Berechnung.
|
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Zitat:
Im übrigen ist das bei jedem Fliesskommawert so, nur wenn eine Ganzzahl rauskommen sollte, fällt es einem auf. Speichert man Pi, merkt keiner ob die letzte Stelle stimmt. Gruss Reinhard |
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
Zitat:
|
AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
ich kann Luckie nur beipflichten.
An der Uni Lernt man zwar Strategien nach denen man Berechnungen numerisch "Stabiler" hin bekommt, aber das Float Format ist einfach nicht das selbe wie man es von Mathe her kennt, auch Double löst das Problem nicht annähernd. Was evtl. hilft, ist dann aber auch schon aufwendiger, Implementiere dir eine Mathe Lib, welche mit Brüchen Rechnen kann. Wie so etwas "im Ansatz" geht kannst du ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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 by Thomas Breitkreuz