Hallo Entwickler!
Also, ich habe folgendes Problem: Ich habe eine Anwendung die Messdaten aus einem File in ASCII Form einliest und intern in einer Liste abspeichert. Die einzelnen Messwerte werden als String eingelesen und dann mittels "atof" in ein Double konvertiert. Intern werden die Daten allerdings als Float gespeichert um Speicher zu sparen. Beim Konvertieren des Double-Wertes in einen Float-Wert kommt es allerdings zu üngewöhnlichen Rundungen der Werte. Aufgefallen ist mir dies beim Debuggen der Anwendung.
Mittels der folgenden Befehlsfolge findet die Konvertierung statt:
<PRE>
CString str("-467.8");
float f = (float)(atof((LPCTSTR) str));
</PRE>
Beim Konvertierung des Wertes -467.8 in String-Form ergibt sich ein Float-Wert von -467.799. Es handelt sich hier nicht gerade um eine schwerwiegende Abweichnung, allerdings ist dies für den Anwender unschön.
Ich habe dann versucht das Problem zu umgehen indem ich den Double-Wert zuerst mit 1000.0 multiplizierte (die Kommastelle also 3 Stellen nach recht schieben) und 0.5 zu addieren (Kommastelle runden!). Anschließend den Wert in einen Integer-Wert konvertieren und diesen Integer-Wert nun in einen Float-Wert konvertieren! Diesen Float-Wert nun durch 1000.0 dividieren und es sollte sich der richte Wert ergeben! Ist allerdings nicht so! Es ergab sich der gleiche Rundungsfehler! (*verblüfft*)
Folgende Codezeilen habe ich für die Konvertierung verwendet:
<PRE>
CString str("-467.8");
double d1 = atof((LPCTSTR) str);
double d2 = d1 * 1000.0 + 0.5;
int i1 = (int) d2;
float f1 = (float) i1;
float f2 = f1 / 1000.0;
</PRE>
Beim Konvertierung des Wertes -467.8 in String-Form ergibt hat sich ebenfalls ein Float-Wert von -467.799 ergeben.
Wenn mir jemand sagen könnte, warum sich diese Abweichnung ergibt bzw. eine Lösung zu den Problem bieten könnte, wäre ich sehr dankbar.
MFG Daniel
Also, ich habe folgendes Problem: Ich habe eine Anwendung die Messdaten aus einem File in ASCII Form einliest und intern in einer Liste abspeichert. Die einzelnen Messwerte werden als String eingelesen und dann mittels "atof" in ein Double konvertiert. Intern werden die Daten allerdings als Float gespeichert um Speicher zu sparen. Beim Konvertieren des Double-Wertes in einen Float-Wert kommt es allerdings zu üngewöhnlichen Rundungen der Werte. Aufgefallen ist mir dies beim Debuggen der Anwendung.
Mittels der folgenden Befehlsfolge findet die Konvertierung statt:
<PRE>
CString str("-467.8");
float f = (float)(atof((LPCTSTR) str));
</PRE>
Beim Konvertierung des Wertes -467.8 in String-Form ergibt sich ein Float-Wert von -467.799. Es handelt sich hier nicht gerade um eine schwerwiegende Abweichnung, allerdings ist dies für den Anwender unschön.
Ich habe dann versucht das Problem zu umgehen indem ich den Double-Wert zuerst mit 1000.0 multiplizierte (die Kommastelle also 3 Stellen nach recht schieben) und 0.5 zu addieren (Kommastelle runden!). Anschließend den Wert in einen Integer-Wert konvertieren und diesen Integer-Wert nun in einen Float-Wert konvertieren! Diesen Float-Wert nun durch 1000.0 dividieren und es sollte sich der richte Wert ergeben! Ist allerdings nicht so! Es ergab sich der gleiche Rundungsfehler! (*verblüfft*)
Folgende Codezeilen habe ich für die Konvertierung verwendet:
<PRE>
CString str("-467.8");
double d1 = atof((LPCTSTR) str);
double d2 = d1 * 1000.0 + 0.5;
int i1 = (int) d2;
float f1 = (float) i1;
float f2 = f1 / 1000.0;
</PRE>
Beim Konvertierung des Wertes -467.8 in String-Form ergibt hat sich ebenfalls ein Float-Wert von -467.799 ergeben.
Wenn mir jemand sagen könnte, warum sich diese Abweichnung ergibt bzw. eine Lösung zu den Problem bieten könnte, wäre ich sehr dankbar.
MFG Daniel
Comment