Hex Werte in Float umrechen

Gast #318269
Lesenswert?
• ▲
▼
Hi ich habe ein Problem:
ich habe Hex-Werte z.B. Buffer1=0x3f, Buffer2=0x77, Buffer3=0xcb,
Buffer4=0x5e (0b00111111011101111100101101011110).Diese will ich nun in
Float ausgeben. Mathematisch habe ich verstanden wie ich es machen muss
mit Vorzeichen (0), Exponent(01111110) und
Mantisse(11101111100101101011110) aber in der C Umsetztung hapert es
noch.
Für meinen Microcontroller habe ich schon mehrere Versuche gestartet
aber keiner hat zum Erfolg geführt. Was nicht geht ist einfach Printf
und %f, wäre auch zu einfach das ganze.

Wie kann ich an dieses Problem rangehen das ich Erfolg habe?
Gast #318270
Lesenswert?
• ▲
▼
Zitat: "Was nicht geht ist einfach Printf und %f, wäre auch zu einfach
das ganze."

Warum eigentlich ?

Möchtest Du die komplizierten Mathematikroutinen aus dem C-Compiler
bzw. dessen Libraries selbst neu erfinden ?
Oder muss in ASM programmiert werden ?
--> Dann sind trotzdem genau diese (aufwändigen) Routinen erforderlich.
Persönliche Seite #318271
Lesenswert?
• ▲
▼
Du könntest beschreiben, wie die "Hex-Werte" Deiner Ansicht nach in
einen Float-Wert umgerechnet werden sollen. Es geht jetzt erst mal
nicht um die interne Floating-Point-Repräsentation, sondern darum,
welchen Float-Wert Du beispielsweise aus den vier von Dir genannten
Werten erzeugen möchtest.

Vorausgesetzt, daß sizeof (float) == 4 kannst Du natürlich mit 'ner
Union sehr wohl printf mit %f verwenden
1
union 
2
{
3
  unsigned char Buffer[4];
4
  float FloatWert;
5
} bla;
6

7
bla.Buffer[0] = 0x3f;
8
bla.Buffer[1] = 0x77;
9
bla.Buffer[2] = 0xcb;
10
bla.Buffer[3] = 0x5e;
11

12
printf("%f", bla.FloatWert);

Aber ob das das ist, was Du erzielen willst?
Gast #318272
Lesenswert?
• ▲
▼
Also eigentlich möchte ich es so einfach wie möglich. ich habe mich an
dem Bsp aus Wikipedia (http://de.wikipedia.org/wiki/IEEE_754)
orientiert und den Code für mich so abgeändert:

unsigned char pis [] = { Buffer[1],Buffer[2],Buffer[3],Buffer[4] };
     float * p;
     p = (float *) pis;
     sprintf (astring,"%30.20f", *p);

es sollte: 0.9679469 rauskommen aber es kommt es nicht ich bekomme
"f" angezeigt wenn ich mir astring anzeigen lasse
Persönliche Seite #318274
Lesenswert?
• ▲
▼
Das kann daran liegen, daß Du nicht mit der floatingpoint-Variante von
printf arbeitest. Aus Gründen der erzeugten Codegröße gibt es bei
Embedded-Compilern davon unterschiedliche Varianten; die
Floatingpoint-Unterstützung bläht das ganze recht heftig aus.

Bist Du Dir mit Deinem Formatstring sicher? Zwanzig(!)
Nachkommastellen? Bei einem 32-Bit-Float-Wert?

Bist Du Dir sicher, daß der erste "Hex-Wert" in Buffer[1] und nicht
in Buffer[0] liegt?
Gast #318275
Lesenswert?
• ▲
▼
Buffer [0] ist bei mir der Unit code mit dem ich bestimme was für ein
Wert da dargestellt wird ( Druck Temperatur oder was auch immer mir der
Sensor liefert)

Ok 20 Nachkommastellen ist wirklich etwas übertrieben, habe nicht
dadran gedacht es zu ändern als ich das Bsp. übernommen habe.

was heißt "daß Du nicht mit der floatingpoint-Variante von
printf arbeitest" Ich nutzt den Crossarm von Rowlley. wo kann ich
rausfinde ob der das unterstützt?

Eben um die Codegröße nicht aufzu blähnen habe ich mir gedacht es
sollte doch möglich sein die mathematisch relativ einfache umrechnung
auch so zu programmieren.
Persönliche Seite #318276
Lesenswert?
• ▲
▼
Ah, ich nahm an, daß Du, wie die meisten hier, mit gcc-avr unterwegs
bist.

Auszug aus der printf-Formatstring-Dokumentation von Crossworks:

   Some CrossWorks library variants do not support the ‘f’
   and ‘F’ conversion specifiers in order to reduce code
   and data space requirements;
   please ensure that you have selected the correct library
   in the Printf Floating Point Support property of the
   project if you use these conversion specifiers.


Das dürfte das Thema aufklären. Viel Erfolg!

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.