Zahl in Float umwandeln

Gast #5115323
Lesenswert?

Guten Tag,

Ich möchte gerne eine Zahl aus einem Array in eine Float Zahl wandeln , 
nur leider mit mässigem erfolg.

Mein Ansatz:

Für TempWert[0] erhalte ich nach der Umwandelung 11.5 das stimmt ja 
nicht.

kann mir jemand weiterhelfen.
mfg
1
signed int TempWert[30];                  // Tempwert-Array für 30 Temperatur Sensor
2

3
TempWert[0] = -111;  //sind 11.1
4
TempWert[1] = +814;  //sind 81.4
5

6
sprintf(read_write_buffer,"%s%d.%d ",(char)TempWert[0] < 0 ? '-' : '+',  TempWert[0]/10,(char)TempWert[0]%10);
#5115335
Lesenswert?

Wozu das ganze (char) gecaste?

Einfacher:
1
sprintf(read_write_buffer, "%+d.%d ", TempWert[0]/10, abs(TempWert[0]%10));

Mit float hat das aber genau genommen nichts zu tun.
Ein zweiter Fehler ist "%s" und dann einen character übergeben. Sollte 
eigentlich mindestens eine Compiler-Warnung geben.
Gast #5115340
Lesenswert?

Joe F. schrieb:
> Wozu das ganze (char) gecaste?
>
> Einfacher:
> sprintf(read_write_buffer, "%+d.%d ", TempWert[0]/10,
> abs(TempWert[0]%10));
>
> Mit float hat das aber genau genommen nichts zu tun.
> Ein zweiter Fehler ist "%s" und dann einen character übergeben. Sollte
> eigentlich mindestens eine Compiler-Warnung geben.

die Temperratur kann ja auch Negativ oder Positiv sein
#5115420
Lesenswert?

Was soll das ganze Gecaste mit dem char? Das ist völliger Blödsinn und 
das solltest du dir ganz dringen abgewöhnen.

Die 11.5 sind auch falsch, kann eigentlich gar nicht sein. TempWert[0] 
ist ja negativ, die if-Anweisung müsste schonmal dazu führen, dass für 
das %s ein - gedruckt wird. Für das erste %d muss eigentlich ein -11 
heraus kommen. Da hast du dann schon ein '--11' stehen und da kommt dann 
noch deine Modulo-Operation hinzu.

Einfacher wäre es wohl wenn du geschrieben hättest:
1
sprintf(read_write_buffer, "%f", TempWert[0]/10.0);

aber das geht warum genau nicht?
#5115710
Lesenswert?

M. K. schrieb:
> Die 11.5 sind auch falsch, kann eigentlich gar nicht sein. TempWert[0]
> ist ja negativ, die if-Anweisung müsste schonmal dazu führen, dass für
> das %s ein - gedruckt wird.

Nein, denn statt %s hätte eigentlich %c heißen müssen. Bei tempWert[1] 
kommt noch dazu, dass das Ergebnis des Casts (char)TempWert[1] davon 
abhängt, ob auf dem Zielcompiler char mit oder ohne Vorzeichen ist.

> Für das erste %d muss eigentlich ein -11 heraus kommen. Da hast du dann
> schon ein '--11' stehen und da kommt dann noch deine Modulo-Operation
> hinzu.

Ja. Da müsste nach dem Punkt eigentlich auch nochmal ein Minus kommen. 
Wenn ich aus dem %s ein %c mache, kommt bei mir auch tatsächlich 
"--11.-1" raus.

> Einfacher wäre es wohl wenn du geschrieben hättest:
> sprintf(read_write_buffer, "%f", TempWert[0]/10.0);
> aber das geht warum genau nicht?

Ich vermute, dass die Nutzung der floating-Point-Lib vermieden werden 
soll. Sonst könnte man in tempWert[0] ja auch gleich 11.1 statt 111 
speichern. Deine Variante braucht zusätzlich zur Floating-Point-Lib auch 
noch ein sprintf, das float unterstützt. So braucht dann nur die eine 
Zeile Code vermutlich mehrere Kilobytes Flash.
#5115744
Lesenswert?

Rolf M. schrieb:
> Ich vermute, dass die Nutzung der floating-Point-Lib vermieden werden
> soll.

Wenn dem so ist: Soll sie aus Zeit- oder aus Größengründen vermieden 
werden?

Wenn genug Flash vorhanden ist, kann man die Berechnung aus Zeitgründen 
trotzdem mit Ganzzahlen machen, aber für die (unkritische) Ausgabe 
normale floats benutzen.

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