Hallo, ich brauche das 32bit WORD einer Fließkommazahl vom Typ float (single precision) z.B. -1,4568 WORD: 101011010001111000001100000000 (nur als Beispiel, das sind jetzt zufällige Bits) Ich habe bereits einen Code (in C) geschrieben, der das schafft, doch der ist ziemlich lang, da er zuerst mal Exponent und Mantisse berechnet und dann erst umrechnen kann. Gibt es eine einfachere (und schnellere) Lösung? (Compiler: AVR-GCC, uC: Atmega2560) Danke im voraus Fabian
Bin mir nicht sicher, ob ich das Problem richtig verstanden habe. Aber vielleicht möchstest Du einfach nur das hier:
1 | float f = -1.4568; |
2 | uint32_t word = *((uint32_t*) &f); |
Das wären dann die Bits, mit denen float intern repräsentiert ist.
Mir ist etwas unklar was du damit bezwecken willst. Benötigst du die die Ausgabe als char Array? sonst würde ja:
1 | float fvalue = 1.2345; |
2 | long lvalue = (long)*((long*)(&fvalue)); //umwandeln des float pointers in longpointer und als long Variable auslesen |
funktionieren. und optional mit der Funktion:
1 | /*
|
2 | ** convert long int to binary string
|
3 | */
|
4 | void ltob(char * buf, unsigned long val) |
5 | {
|
6 | signed char i; |
7 | |
8 | buf+=32; |
9 | *buf-- = 0; |
10 | |
11 | for (i=31; i>=0; i--) { |
12 | *buf-- = val%2 + '0'; |
13 | val >>= 1; |
14 | }
|
15 | }
|
in ASCII konvertieren. Aber alles nur Theorie, testen konnte ich es jetzt noch nicht...
Mit GCC würd ich das so machen:
1 | #include <stdint.h> |
2 | |
3 | static __inline__ __attribute__((always_inline)) |
4 | uint32_t float_to_u32 (float f) |
5 | {
|
6 | uint32_t i; |
7 | __asm__ ("" : "=r" (i) : "0" (f)); |
8 | return i; |
9 | }
|
Danke für die Lösungen für mein Problem. Nach einem Blick ins C-Buch würde eine union mit einer float-, und (32bit)integer-Variable auch zum umwandeln reichen. Am besten gefällt mir aber die pointer-Variante. Nochmals Danke für eure Hilfe.
Fabian K. schrieb: > Nach einem Blick ins C-Buch würde eine > union mit einer float-, und (32bit)integer-Variable > auch zum umwandeln reichen. Eine union wandelt nix um, sondern interpretiert die Bits nur anders ;-)
Fabian K. schrieb: > Danke für die Lösungen für mein Problem. > > Nach einem Blick ins C-Buch würde eine > union mit einer float-, und (32bit)integer-Variable > auch zum umwandeln reichen. Dann ist es aber ein schlechtes C-Buch, denn selbiges hat undefined behavior (wegen type punning). > Am besten gefällt mir aber die pointer-Variante. Ditto, wegen strict Aliasing.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.