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

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.