Achtung Cast
-
Hallo,
ich hab versucht aus einem TEdit Element den String zu nehmen, den Cast auf double durchzuführen und dann den erhaltenen Wert auf float zu casten. Also etwa sodouble myDouble = Edit1->Text.ToDouble(); float myFloat = (float)myDouble;
Anscheinend gibt es keine Methode String.ToFloat() sonst hätt ich das gleich auf float gecastet.
Jetzt komm ich zum Punkt:
gab ich ins Editfeld ,2 ein
also wollte 0.2 raus haben
kam etwas in der Richtung 0.2000000294 herausDie Folge war das ich alle floats in double umwandeln durfte.
Hat jemand etwas ähnliches erlebt oder eine Lösung gefunden wie man diesen Cast-Humbug wieder hinbekommt?
-
hallo,
schau dir mal die Format-funktion an, in der hilfe gut beschrieben, damit kannst du die ausgaben auf deine wünsche anpassen.
warum da so etwas rauskam weiß ich auch nicht...mfg
murph
-
Es geht nicht um die Ausgaben, da ich in meinem Programm die float Werte vergleichen wollte, wären 0,2 und 0,200000294 unterschiedliche Zahlenwerte. Das darf natürlich nicht sein.
-
Aufgrund der unvermeidlichen Ungenauigkeit von Computern kannst du Gleitkommazahlen nicht zuverlässig direkt miteinander vergleichen. Habe gerade erst irgendwo eine Abhandlung dazu gelesen, finde es aber auf die Schnelle nicht wieder.
Auf jeden Fall kein BCB-Problem, verschoben nach "Rund um"
-
Verstehe nicht warum das kein BCB Problem sein soll. Schließlich castet doch bestimmt nicht jeder C-Compiler eine double 0.2 auf eine float 0.200000294 oder???
-
Doch. Weil das Mathematik ist, und kein C. Assembler oder Visual Basic würden das genauso casten. Das hat mit der Darstellung von Fließkommazahlen zu tun, wie sie vom IEEE spezifiziert wurde.
-
Die unterschiedliche Darstellung von 64 und 32 Bit Gleitkommazahlen ist ja klar. Aber gibt es denn wirklich keine Bibliothek die vernünftige Casts zwischen den beiden Formaten auf die Reihe bringt?
-
du KANNST mit den 32 Bit floats einfach 0.20000000000000 nicht genau darstellen. da wird dann eben ein 0.20000000094 oder was auch immer draus.
es geht nicht anders.
deshalb auch nie mit float/doubles und == arbeiten. lieber ne extra funktion schreiben, die den rundungsfehler berücksichtigt.
-
ps: oder sowas: http://www.swox.com/gmp/
-
Wie werden denn die Zahlen nun eigentlich im Speicher dargestellt und warum ist die Umwandlung von 0,2 float zu 0,2 double so schwierig?
-
Es gibt ein Vorzeichen Bit eine Mantisse, einen Exponenten und noch ein paar zusatzbits für NAN, ...
-
Das Problem ist, daß der Rechner ja alles binär speichern muß. Und genau da liegt bei 0.2 dezimal auch das Problem. Es ist binär nämlich periodisch, also muß der Rechner irgendwo runden. Ab da wird's dann halt falsch.