Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fließkommatypen, wie wird aus 0.999999765 wieder 1? (https://www.delphipraxis.net/155591-fliesskommatypen-wie-wird-aus-0-999999765-wieder-1-a.html)

arc 30. Okt 2010 12:09

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!

toms 30. Okt 2010 12:15

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;

jfheins 30. Okt 2010 12:24

AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
 
Zitat:

Zitat von arc (Beitrag 1058605)
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!

Fehler 1: Du benutzt Gleitkommazahlen obwohl es dir anscheinend auf Akkuratheit ankommt (engl. accuracy, deu. "absolute Genauigkeit")
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.

arc 30. Okt 2010 13:17

AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
 
Danke! Currency löst das Problem sehr elegant!

toms 30. Okt 2010 13:20

AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
 
Zitat:

Zitat von arc (Beitrag 1058619)
Danke! Currency löst das Problem sehr elegant!

Dennoch ist mir nicht klar, warum bei dir in die INI 0,99999999987542 geschrieben wurde, obwohl eigentlich eine 1 geschrieben wurde...

Satty67 30. Okt 2010 13:32

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.

Luckie 30. Okt 2010 13:38

AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
 
Wahrscheinlich stammt der Wert aus einer Berechnung.

Reinhard Kern 30. Okt 2010 15:19

AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
 
Zitat:

Zitat von Luckie (Beitrag 1058625)
Wahrscheinlich stammt der Wert aus einer Berechnung.

Und wenn er so weiterverwendet wird, ist das ja auch nicht weiter schlimm - im Sinn der Fliesskommaarithmetik ist 0.999999765 so gut wie 1, die Ungenauigkeit wird bei Weiterverwendung auch nicht grösser als in einer direkten Berechnung. Es sieht halt bloss in der INI bescheuert aus.

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

Luckie 30. Okt 2010 16:39

AW: Fließkommatypen, wie wird aus 0.999999765 wieder 1?
 
Zitat:

Zitat von Reinhard Kern (Beitrag 1058636)
die Ungenauigkeit wird bei Weiterverwendung auch nicht grösser als in einer direkten Berechnung

Aber hallo, und ob die Ungenauigkeit größer wird und zwar mit jeder Multiplikation und Division. Deswegen hat man ja auch in der Schule gelernt, dass man erst ganz zum Schluss das Ergebnis sinnvoll rundet.

Corpsman 30. Okt 2010 23:13

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 Hier z.B. anschauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz