atof ungenau

OP #6314626
Lesenswert?
• ▲
▼
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
Gast #6314670
Lesenswert?
• ▲
▼
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 #6314820
Lesenswert?
• ▲
▼
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".

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.