Forum: Mikrocontroller und Digitale Elektronik AVR float --> 32bit WORD


von Fabian K. (fabian_k)


Lesenswert?

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

von Guest (Gast)


Lesenswert?


von xfr (Gast)


Lesenswert?

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.

von Erik .. (erik_mit_k)


Lesenswert?

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...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
}
  

von Fabian K. (fabian_k)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.