Forum: Mikrocontroller und Digitale Elektronik Zahl in Float umwandeln


von werner (Gast)


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);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
float Wert;
7
8
9
Wert = TempWert[0] / 10.0;


Damit ist der Wert in float umgewandelt.

von Joe F. (easylife)


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.

: Bearbeitet durch User
von werner (Gast)


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

von Joe F. (easylife)


Lesenswert?

werner schrieb:
> die Temperratur kann ja auch Negativ oder Positiv sein

und? deswegen speicherst du sie ja auch in einem (signed) int.

Was wäre mit Temperaturen > 12.7 °C ?

: Bearbeitet durch User
von M. K. (sylaina)


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?

: Bearbeitet durch User
von Rolf M. (rmagnus)


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.

von S. R. (svenska)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.