Warum funktioniert float->char Konvertierung nicht korrekt ?

Gast #926117
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
>...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
Lesenswert?
• ▲
▼
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren