Forum: Mikrocontroller und Digitale Elektronik Zahl in Float umwandeln


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von werner (Gast)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.