Forum: Compiler & IDEs Float in einer struct


von Klaus (Gast)


Lesenswert?

Hallo,

kann mir jemand bitte erklären wie eine float zahl in einer struct 
aufgelöst wird?
1
typedef struct TEST
2
3
{
4
5
float p1,
6
7
p2;
8
9
10
} TEST;

jetzt lege ich die struct auf einer sd karte ab und erhalte folgenden 
Inhalt:

Bei p1=0 und p2=0
20 20 20 20 20 20 20 20

Bei p1= 1.0 und p2 = -1.0
BC 8E FA 35 3C 8E FA 35

Viele Grüße
Klaus

von PittyJ (Gast)


Lesenswert?

Floats werden meist nach IEEE 754 kodiert.
http://de.wikipedia.org/wiki/IEEE_754

Nach meinen Erfahrungen hat eine 0.0 auch meist ein 00 00 00 00 als 
Muster.
Und die 1 und -1 sind auch durch einfachere Bitmuster dargestellt.

Kann es sein, dass das Ablegen oder das Einlesen nicht funktioniert?
20 20 20 ... sind ja ASCII-Leerzeichen, also deutet das auf einen String 
hin.

von Klaus W. (mfgkw)


Lesenswert?

- IEEE754
- Wikipedia Gleitkommazahlen
- docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

von Klaus (Gast)


Lesenswert?

die 20 20 20 20 bei Bei p1=0 und p2=0 war der Editor
in wirklichkeit steht 00 00 00 00 drin.

Aber wie man auf die Werte kommt ist mir unerklärlich:
Bei p1= 1.0 und p2 = -1.0
BC 8E FA 35 3C 8E FA 35

Vorzeichen ist noch klar, aber dann??

von Karl H. (kbuchegg)


Lesenswert?

Klaus schrieb:
> die 20 20 20 20 bei Bei p1=0 und p2=0 war der Editor
> in wirklichkeit steht 00 00 00 00 drin.
>
> Aber wie man auf die Werte kommt ist mir unerklärlich:
> Bei p1= 1.0 und p2 = -1.0
> BC 8E FA 35 3C 8E FA 35
>
> Vorzeichen ist noch klar, aber dann??

IEEE754

Dokument suchen, Beschreibung lesen und verstehen.

Das ganze ist nicht so einfach. Nur mit viel Übung kann man einer Zahl 
in Hex-Form ansehen, welcher Dezimalzahl das ganze entspricht. In 
Kurzform: die Zahl wird in der Form Mantisse + Exponent dargestellt, 
wobei die Mantisse immer in den Bereich 0 bis 1 normiert wird. Der 
Exponent wird so gewählt, dass die Mantisse soweit nach links verschoben 
wird, dass das erste 1-Bit links rausfällt.

Würde man das ganze mit Dezimalzahlen machen dann würde man zb so 
vorgehen: Die Zahl 37625.32 soll als Floating Point dargestellt werden, 
wobei in der Mantisse nur 3 Stellen erlaubt sind. Man muss daher die 
Zahl als 376 mal 10 hoch 2 (oder in Kurzschreibweise 376E2) darstellen. 
Macht man dasselbe mit der Zahl 58.724 so ist die Darstellung dann 
587E-1. Die Mantisse wird also so aufgeblasen, dass die Stellen der 
Mantisse voll ausgenützt werden und dafür wird mit dem Exponent das 
Komma entsprechend 'verschoben'.

Nur dass es im Rechner nicht als Dezimalzahl sondern als Binärzahl 
gemacht wird und die Mantisse immer eine Zahl zwischen 0 und 1 
darstellt. So gesehen wären die 37625.32  dann im Rechner eher 
0.3762532E5 und die 58.724 sind 0.58724E2. Und da jetzt alle 
Mantissen-Zahlen immer im Bereich 0 bis 1 sind, braucht man sich auch 
nicht merken, dass sie mit 0. anfangen:
37625.32  -> 3762532 E 5
58.724    -> 5872 E 2
da die Anzahl der Mantissenstellen aber nach wie vor begrenzt ist 
(angenommen 3) landet man bei
37625.32  -> 376 E 5
58.724    -> 587 E 2

(Allerdings ist auch das noch nicht alles. Da gibts noch mehr, was man 
wissen muss um ein Bitmuster wieder in eine für uns vertraute Form 
rückzuübersetzen. Weiteres siehe jedes Dokuemnte über IEEE754)

von Klaus (Gast)


Lesenswert?

danke,
hier ein Link zu einem IEEE754 konverter.
Wenn ich da meine daten eingebe erhalte ich was ganz anderes.
compiler ist avr32 gnu c

von Klaus (Gast)


Lesenswert?


von Klaus (Gast)


Lesenswert?

so langsam wirds Tag.
Ich muß noch eine Umrechnung machen dann sollte es passen.

von tom (Gast)


Lesenswert?

Klaus,

Wenn ich Dich recht verstehe, möchtest Du Deinen float Wert byteweise 
auf SD-Card wegschreiben/lesen ?
Mach es Dir nicht zu schwer, so lange Du die 4 bytes in gleicher 
Reihenfolge schreibst/liest, wird das klappen.

Ungefähr so:

typedef union
{
    float f;
    uint8 b[4];
}IEEE754_t;

/* wenn es denn in einer struct sein soll... */
struct
{
    IEEE754_t p1,
    IEEE754_t p2;
} Values;


Mit Values.p1.b[n] kannst Du dann auf die einzelnen bytes zugreifen und 
die wegschreiben/lesen.
Aber, viele Wege führen nach Rom, mach was draus ;o).

tom.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Irgendwas stimmt wohl mit dem Auslesen nicht, oder AVR32 hat einei 
eigene, recht selsame Darstellung.

In IEEE-754 wird eine 1.0 zu

3F 80 00 00

und -1.0 zu

BF 80 00 00

wobei hier das MSB links steht

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.