Hallo, ich habe ein Problem. Ich möchte ein Char Array in ein float bzw. double Wert Konvertieren. Ich meinem Array habe ish folgendes stehen: 101234.1239 Jetzt wandle ich mit atof den Wert um. Als Ergebnis erhalte ich aber 101234.1171 Gibt es eine andere Möglichkeit die Konvertierung genauer hinzubekommen? mfg. Frank
Frank B. schrieb: > float bzw. double Das ist ein himmelweiter Unterschied. float ist auf 6 … 7 Dezimalstellen genau, double auf 14. Deine gewünschte Auflösung lässt sich nur mit double realisieren.
Gast
#6314670
Frank B. schrieb: > Gibt es eine andere Möglichkeit die Konvertierung genauer hinzubekommen Nein. Das ist die nächstliegende binäre float-Zahl an deiner Dezimalzahl, und dann wieder bei der Rückumwandlung die nächstliegende Dezimalzahl zu dem binären float. Musst du halt double verwenden oder BCD Arithmetik
Gast
#6314682
Oder mit 10000 multiplizieren und als integer 32 oder 64 weiterrechnen.
Gast
#6314779
Fritz Fischer schrieb: > Oder mit 10000 multiplizieren und als integer 32 oder 64 > weiterrechnen. Einen String multiplizieren?
wer schrieb: > Einen String multiplizieren? Ja und, dads ist bei Zehnerpotenzen doch easy.
Gast
#6314820
Die Zahl .1239 (und damit auch 101234.1239) ist überhaupt nicht binär
repräsentierbar, denn es wäre eine periodische Zahl, d.h. egal wie viele
binär-Ziffern man hinzufügt ist es immer noch nicht genau, egal ob man
float, double, long double... verwendet. Ist letztlich genau wie 1/3,
was sich im Dezimalsystem auch nicht mit (endlich vielen) Ziffern
darstellen lässt.
Wenn man die Zahl als "double" speichert und "direkt" z.B. mit
printf("%f") ausgibt, sieht es zwar so aus als wäre die Zahl korrekt
gespeichert, aber das stimmt nicht - printf rundet hier standardmäßig.
Gibt man sie mit voller Präzision aus ("%.17f") sieht man die
Abweichung.
Das Problem ist also nicht lösbar. Wenn du alle rationalen Zahlen
darstellen möchtest, musst du Nenner und Zähler speichern. Wenn du nur
alle dezimal darstellbaren Zahlen speichern können möchtest (also z.B.
nicht 1/3), reicht eine Dezimal-Float/Fixed-Darstellung. Wenn du diese
Zahl gar nicht absolut exakt darstellen möchtest sondern die Abweichung
von ca. 0.000000000006 okay ist, nimm einfach "double".
Gast
#6315530
Achtung, der avr-gcc kennt nur float. Double ist dort in Wirklichkeit float.
Stefan ⛄ F. schrieb: > Achtung, der avr-gcc kennt nur float. Double ist dort in Wirklichkeit > float. Das war so bis v9. Ab v10 wird auch 64-Bit (long) double unterstützt: http://gcc.gnu.org/gcc-10/changes.html#avr
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.