Datentypenkonvertierung- zum verrückt werden ;-)
-
Hey Leute,
Also ich habe hier ein ziemlich dämliches Problem und frage mich schon langsam, wer jetzt der Dümmere ist... der PC oder ich selbst xD.
Und zwar habe ich hier einfach mal ein kleines Beispielprogramm zu meinem Fehler geschrieben:String hallo = "123456789"; float h=0; h=StrToFloat(hallo); Button1->Caption = FloatToStr(h);Im String "hallo" wird die lange Zahl 123456789 gespeichert.
Dann wird diese Zahl mit StrToFloat in der Floatvariable "h" gespeichert.
Diese wird anschließend auf dem Button ausgegeben.
Und was ist das Ergebnis?http://Jesusfreak777.je.funpic.de/button.JPG
Total falsch

cya
David
*edit: Mit "double" funktioniert jetzt alles perfekt- dennoch müsste es auch noch mit float funktionierenk, da auch meine eingegebene zu konvertierende Zahl float noch nicht übersteigt.*
-
Hallo
das ist nicht weiter verwunderlich, denn float ist nun mal kein 100% genaues Datenformat. Das es mit double klappt ist auch nachvollziehbar. Das ist auch nicht VCL- oder Builder abhängig, sondern auch mit dem MinGW und Standard-Mitteln so
std::stringstream std; std << "123456789"; float f; std >> f; std.clear(); std << "123456789"; double d; std >> d; std::cout.precision(10); std::cout << f << " " << d << std::endl;Genaugenommen verwenden ja alle normalen Floating-Point-Implementation die Prozessor-eigene FPU, so das auch die gleichen Ergebnisse zu erwarten sind.
In Gegensatz zu int hat allerdings float nicht nur einen Wertebereich, sondern auch eine Genauigkeit. Deine Zahl übertrift zwar nicht den Wertebereich, aber überfordert die Genauigkeit des float-Datentypes, nicht aber die des double. Deshalb dürfen auf Gleitkommazahlen auch niemals direkte Verlgeiche gemacht werden, sondern nur Epsilon-Betrachtungen.
float zahl = ...; /Berechnung // Falsch, float sind äußerst unwahrscheinlich 0, es sei denn es wird direkt zugewiesen if (zahl == 0) { } // Richtige Epsilon-Betrachtung, bei einer Genauigkeit von 3 Nachkommastellen if (zahl < 0.001 && zahl > -0.001) { }Wenn du mit korrekten Dezimalzahlen rechnen willst, must du entweder int/long... nehmen, oder wenn diese nicht mehr ausreichen dann selber eine Dezimal-Klasse schrieben bzw. eine externe wie die in der GMP-Library benutzen.
bis bald
akari
-
Okay- vielen Dank für die nette Erklärung- dann werde ich wohl vorerst mit double arbeiten müssen...
