PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : StrToFloat Bug


mutzel
2003-05-28, 11:20:47
if(0.53==StrToFloat("0,53"))
ShowMessage(FloatToStr(StrToFloat("0,53"))+"=="+FloatToStr(0.53));


warum spuckt dieser code keine msg aus?

also nur so vom prinzip sollte 0,53 eigendlich gleich 0,53 sein oder?

ich hab das ganze mit dem Borland C++ Builder 5.0 gebastelt ... woran koennte dieser "bug" liegen

stabilo_boss13
2003-05-28, 11:43:34
Original geschrieben von mutzel

if(0.53==StrToFloat("0,53"))
ShowMessage(FloatToStr(StrToFloat("0,53"))+"=="+FloatToStr(0.53));


warum spuckt dieser code keine msg aus?

also nur so vom prinzip sollte 0,53 eigendlich gleich 0,53 sein oder?

ich hab das ganze mit dem Borland C++ Builder 5.0 gebastelt ... woran koennte dieser "bug" liegen

StrToFloat erwartet einen String im Zahlenformat:

StrToFloat("0.53")

Du musst das Komma durch einen Punkt ersetzen.

mutzel
2003-05-28, 11:53:16
ersetzt man das komma durch nen punkt bekommt man ne meldung das diese zahl keine zahl ist .... das liegt daran das die funktion in einem deutschen os nur mit nem komma funtzt und in nem englischen nur mit nem punk ....

und daher bei mir beim ausfuehren keine fehlermeldung kam kann es einfach ma nicht an der schreibweise liegen

mutzel
2003-05-28, 11:59:09
if(FloatToStr(0.53)==FloatToStr(StrToFloat("0,53")))

schreibt man das ganze so hier gehts wunderbar .. das problem ist das ich diesen vorgange mehrere tausend ma machen muss .. und wollte daher ne moeglichst schneller variante haben

ausserdem sollte es ja rein theoretich auch so gehn
if(0.53==StrToFloat("0,53"))

da is halt nur noch die frage warum es halt eben nicht geht

stabilo_boss13
2003-05-28, 13:50:59
Komisch!

Was gibt denn
cout << StrToFloat("0,53");
aus?

Denn ganz offensichtlich gibt der Ausdruck 0.53==StrToFloat("0,53") false zurück. Das bedeutet, dass die Konvertierungsfunktion etwas anderes als 0.53 zurückgeben muss.

Deshalb funktioniert auchif(FloatToStr(0.53)==FloatToStr(StrToFloat("0,53")))da du ja auf beiden Seiten die Funktion benutzt.

x-dragon
2003-05-28, 13:55:18
Kann es sein das der Float-Wert nochmal auf 2 Kommastellen formatiert werden muss, damit er gleich ist?

Dr Hardware
2003-05-28, 14:40:56
@mutzel
Warum verwendest du überhaupt StrToFloat ? StrToFloat nimmt man IMO eigentlich nur z.B wenn du den Inhalt eines Textfeldes auslesen willst du in Fließkommavariable speichern willst.Ansonsten kannst du mal versuchen 0.53 einmal in einen AnsiString zu konvertieren und dann mit einer entsprechenden Variable, die du für den Vergleich willst zu vergleichen(dabei muss die Variable auch in einen AnsiString konvertiert werden).

Vedek Bareil
2003-05-28, 17:42:54
versuch's doch mal mit atof statt StrToFloat:
if (0.53 == atof("0.53")) ...

Xmas
2003-05-28, 18:28:43
Original geschrieben von mutzel

if(0.53==StrToFloat("0,53"))
ShowMessage(FloatToStr(StrToFloat("0,53"))+"=="+FloatToStr(0.53));


warum spuckt dieser code keine msg aus?

also nur so vom prinzip sollte 0,53 eigendlich gleich 0,53 sein oder?

ich hab das ganze mit dem Borland C++ Builder 5.0 gebastelt ... woran koennte dieser "bug" liegen


if(0.53f==StrToFloat("0,53"))
ShowMessage(FloatToStr(StrToFloat("0,53"))+"=="+FloatToStr(0.53));


0.53 lässt sich als binäre FP-Zahl nicht exakt darstellen, als double ist die Darstellung aber exakter.

Vedek Bareil
2003-05-28, 23:46:15
Original geschrieben von Xmas
0.53 lässt sich als binäre FP-Zahl nicht exakt darstellen, als double ist die Darstellung aber exakter. hm, diesen Gedanken hatte ich auch schon, aber wenn x die Zahl ist, die anstelle von 0.53 dargestellt wird, dann sollte StrToFloat("0,53") doch auch genau diese Zahl x ergeben, oder nicht?
Oder gibt StrToFloat standardmäßig auf double aus, so daß StrToFloat("0,53") eine Zahl y ausspuckt, die wegen ihres double-Formats näher an 0.53 dran ist als x, das nur single/float ist?

Edit: ich hab jetzt mal folgendes ausprobiert (unter Dev-C++)
if (0.53 == atof("0.53")) cout << "True, ";
else cout << "False, ";
if (0.53f == (atof("0.53"))) cout << "True";
else cout << "False";
und die Ausgabe ist True, False. Dann hab ich die zweite if-Anweisung umgeformt zu:
if (0.53f == static_cast<float>(atof("0.53"))) cout << "True";
else cout << "False";
und die Ausgabe wurde True, True. Das bedeutet, daß atof nach double ausgibt und 0.53 standardmäßig double ist, während 0.53f float ist.

Kann natürlich sein, daß das bei Borland anders ist. Oder daß dort StrToFloat nach float ausgibt.

Xmas
2003-05-29, 00:09:55
Original geschrieben von Vedek Bareil
und die Ausgabe wurde True, True. Das bedeutet, daß atof nach double ausgibt und 0.53 standardmäßig double ist, während 0.53f float ist.

Kann natürlich sein, daß das bei Borland anders ist. Oder daß dort StrToFloat nach float ausgibt.
atof gibt in der Tat double zurück. "0.53" ist in C immer double, "0.53f" ist float. Entweder gibt StrToFloat float zurück oder nimmt es mit der Konvertierung nicht so genau.