Zahl in Float umwandeln

Gast #5115323
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 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.