Warum funktioniert float->char Konvertierung nicht korrekt ?

Gast #926117
Hallo Forum,

ich brauche für mein µC - Projekt eine Möglichkeit float->char* zu 
konvertieren. In der stdio.h gibt es ja z.B. sprintf, was aber mein C30 
Compliler nicht bietet.

Es ist ja auch egal. Ich habe mir selbst ein Programm geschrieben, 
welches mir die Konvertierung für beliebig viele Stellen macht.

Allerdings funktioniert es nicht immer korrekt. Wenn ich 0,015 in char 
konvertiere, bekomme ich '0'',''0''1''4''9''9' heraus ? Viele andere 
Zahlen gehen wieder wunderbar. Es gibt eben einige Ausnahme, wie z.B. 
0,015 oder 0,01.

Vielleicht weiß jemand die Ursache ?


Hier der Code:
1
#include <iostream>
2
#include <string.h>
3
#include <stdio.h>
4
using namespace std;
5

6
int main(void)
7
{
8
     float f=0.015;       //zu konvertierende float Zahl
9
     int i=0;
10
     int j=0;
11
     int k=0;
12
     int NO=1;  
13
       
14
     char c[10];
15
     
16
     if(f<0)                   //Vorzeichenkontrolle
17
     {      c[i]='-';
18
            f*=-1;
19
            i++;
20
     }
21
     else
22
     {
23
         c[i]='+';
24
         i++;
25
     }
26
     
27
     while(1)                 //Zerlegung
28
     {
29
       if(f/10.0<1.0)
30
       {
31
          c[i]=(int)f%10+48;   //Offset von 48 - ASCII
32
          i++;
33
          for(j=0;j<9;j++)     //Komma bereits gesetzt ?
34
          {
35
             if(c[j]=='.') NO=0;
36
          }
37
          if(NO && k==0)
38
          {
39
          c[i]='.';
40
          i++;
41
          }
42
          if(k!=0)
43
          k--;
44
          
45
          f=f-((int)f%10);
46
          f*=10;
47
       }
48
       
49
       else 
50
       {
51
       f/=10.0;
52
       k++;
53
       }
54
       
55
       if(i==8) break;
56
     }                  
57
     
58
     char* str = &c[0];
59
     cout<<"\n"<<c[0]<<c[1]<<c[2]<<c[3]<<c[4]<<c[5]<<c[6]<<c[7];
60
     
61
     cin>>f;
62
     return 0;
63
}

Ich bin keiner, der effiziente Algorithmen programmiert, aber mein Code 
funktioniert meistens :) Also bitte nicht aufregen, wenn ich es zu 
umständlich mache oder den Wald vor lauter Bäumen übersehe.

MfG
Frank
Gast #926119
in float lässt sich leider eine 0.015 nicht darstellen, dein µC hat nach 
der zuweisung eine 0.0.14999999999999 gespeichert. Musst also auf die 
anzahl stellen runden die du ausgeben willst. Das ganze ist ein 
generelles Problem mit float.
Gast #926129
>...in float lässt sich leider eine 0.015 nicht darstellen...

Wenn ich sowas in MSVC++ schreibe:
1
   float flt1=0.014999999;
2
   float flt2=0.015;
3

4
   printf("%f  %f",flt1, flt2);

dann kommt heraus:
  0.01500  0.01500

Wie denn dann das?
#926135
lkmiller wrote:
>>...in float lässt sich leider eine 0.015 nicht darstellen...
>
> Wenn ich sowas in MSVC++ schreibe:
>
1
>    float flt1=0.014999999;
2
>    float flt2=0.015;
3
> 
4
>    printf("%f  %f",flt1, flt2);
5
>
>
> dann kommt heraus:
>   0.01500  0.01500
>
> Wie denn dann das?

Weil printf bei der Ausgabe selbst rundet.

Probier mal:

   printf("%.6f  %.6f",flt1, flt2);
Gast #926188
und wenn du es in int wandelst?

also die round(0.014999999 * 10000000) und dann hast du 150000 - wenn du 
die ausgabe eh selber machst braucht du bloss noch das komma richtig zu 
setzten

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.