Forum: PC Hard- und Software Gleitkommazahl in Dezimal umwandeln


von Nobody (Gast)


Lesenswert?

Die GKZ 0x40700000 soll in Dezimal umgewandelt werden.
Ich bin soweit gekommen:

0x 40700000 = 0b 1000000011100000000000000000000

Weiter komme ich nicht. Das Ergebnis ist 3,75.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Hier sind die IEEE-FP-Formate beschrieben:

  https://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE-754-Standards

Das in der Aufgabe verwendete Format (32 Bit) heißt "single".

von Stephan (Gast)


Lesenswert?

3,75 hast Du ausgerechnet oder weiss Du, dass es das Ergebnis ist?
Es stimmt jedenfalls.
Du kannst Dir den Lösungsweg erarbeiten, indem Du Dich mit der 
Gleitkommadarstellung nach IEEE-754 befasst.
VG, Stephan

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Diese beiden Seiten haben mir geholfen, FP16 in FP32 und zurück zu 
rechnen. Erklären 16, 32, 64, 128 bit float:
https://www.h-schmidt.net/FloatConverter/IEEE754.html
http://weitz.de/ieee/

: Bearbeitet durch User
von Nobody (Gast)


Lesenswert?

Yalu X. schrieb:
> Hier sind die IEEE-FP-Formate beschrieben:
>
> 
https://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE-754-Standards
>
> Das in der Aufgabe verwendete Format (32 Bit) heißt "single".

In dem Artikel geht es darum eine Dezimalzahl in Binär umzuwandeln. Ich 
will eine Hexzahl (float) in Dezimal umwandeln und nicht in Binär.

von Oliver S. (oliverso)


Lesenswert?

Nobody schrieb:
> In dem Artikel geht es darum eine Dezimalzahl in Binär umzuwandeln. Ich
> will eine Hexzahl (float) in Dezimal umwandeln und nicht in Binär.

Du musst schon nach unten schmollen und weiterlesen.

Oliver

von Nobody (Gast)


Lesenswert?

Oliver S. schrieb:
> Nobody schrieb:
>> In dem Artikel geht es darum eine Dezimalzahl in Binär umzuwandeln. Ich
>> will eine Hexzahl (float) in Dezimal umwandeln und nicht in Binär.
>
> Du musst schon nach unten schmollen und weiterlesen.
>
> Oliver

Steht nicht drin.

von Stephan (Gast)


Lesenswert?

Nobody schrieb:
> Steht nicht drin.
Bist Du ein Troll?

Wie gesagt: Du kannst Dir den Lösungsweg erarbeiten, indem Du Dich mit 
der
Gleitkommadarstellung nach IEEE-754 befasst. Da gibts neben Büchern (das 
sind diese Dinger aus dem gleichen Material wie Klopapier - Achtung: 
Beim Klopapier kann man wischen, beim Buch nicht) auch geschätzt 1 Mio 
google Treffer.

Alle relevanten Hinweise hast Du doch schon - und ja: es steht in dem 
Wiki Artikel drin (ok - nicht, wenn Deine Schmoll-Taste klemmt...)
In der Zeit hättest Du schon die nächste Aufgabe aus Deinem Übungsbogen 
lösen können.

von Dirk K. (merciless)


Lesenswert?

Stephan schrieb:
> Wie gesagt: Du kannst Dir den Lösungsweg erarbeiten, indem Du Dich mit
> der
> Gleitkommadarstellung nach IEEE-754 befasst.

Aber er will seine Hausaufgaben ja nur abschreiben,
nicht "erarbeiten".

merciless

von Sigi (Gast)


Lesenswert?

Einfach in C oder C++ im Speicher ablegen,
den Pointer auf die Addresse nach float*
casten und per printf oÄ ausgeben.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Nobody schrieb:
> Steht nicht drin.

Da gibt es sogar ein detailliert beschriebenes Beispiel für die
Umrechnung, allerdings nicht mit exakt der gleichen Zahl wie in deiner
Aufgabe. Um das Beispiel leichter auf andere Zahlen anwenden zu können,
hilft es, den Aufbau der IEEE-754-Zahlen verstanden zu haben. Genau
deswegen habe ich oben nicht direkt das Beispiel, sondern den Abschnitt
mit den Zahlenformaten verlinkt.

Also lies erst dieses

  https://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE-754-Standards

und dann dieses

  https://de.wikipedia.org/wiki/IEEE_754#Berechnung_IEEE754-Gleitkommazahl_%E2%86%92_Dezimalzahl

Möchtest du noch mehr vorgekaut bekommen?


Sigi schrieb:
> Einfach in C oder C++ im Speicher ablegen,
> den Pointer auf die Addresse nach float*
> casten und per printf oÄ ausgeben.

Das Ergebnis ist ja bereits bekannt.

von Sigi (Gast)


Lesenswert?

Yalu X. schrieb:
> Das Ergebnis ist ja bereits bekannt.

Ja, klar. Steht ja auch im ersten Beitrag vom TO.
Dein erster Beitrag beschreibt das Format, meiner
einen (zuverlässigen) Weg, sein Ergebnis zu
bestätigen. Wenn er dann mal eine konkrete Frage
stellt, kann man ja weiterdiskutieren...

von Yalu X. (yalu) (Moderator)


Lesenswert?

Sigi schrieb:
> Dein erster Beitrag beschreibt das Format, meiner einen
> (zuverlässigen) Weg, sein Ergebnis zu bestätigen.

Ok, einverstanden. Die Verifikation eines Ergebnisses mit einer anderen
Methode ist natürlich nie ein Fehler.

Deswegen reiche ich gleich noch eine dritte nach (in Python):

1
from struct import *
2
3
i = 0x40700000
4
f = unpack('f', pack('I', i))[0]
5
6
print(f)

:)

von sid (Gast)


Lesenswert?

oh man.. also noch weiter vorkauen, ehrlich?..

32bit binär:
0100 0000 0111 0000 0000 0000 0000 0000

0 - 10000000 - 11100000000000000000000
vorzeichen - exponent - mantisse(ohne hidden bit)

dezimaler exponent:
128 minus bias(127) = 1
höchster Exponent ist demnach 1

hinzufügen des hidden bit(immer 1) zur mantisse
1,11100....
und verschieben des Kommas um den höchsten Exponenten (hier 1)
11,1100....
das ist also die binäre 'lesbare' Darstellung deiner gesuchten 
Dezimalzahl.

dann von links nach rechts jede Stelle als Bit * 2^exponent notieren,
dabei den Exponenten jeweils um eins verringern
startend bei dem höchsten Exponenten (von oben)

1* 2^1 (2)
1* 2^0 (1)  // (komma nach 2^0 diente ja nur der besseren Lesbarkeit)
1* 2^-1 (0.5)
1* 2^-2 (0.25)
0* 2^-3 (0,125)
0* 2^-4 (0,0625)
.....
gesetzte Bit zusammenaddieren
 3,75
Vorzeichen ändern falls nötig (ist es hier nicht)
fertig!

ist doch sooo schwierig nicht zu verstehen,
schongarnicht mit dem oben verlinkten wiki artikel,
da steht es ja haarklein drin

'sid

von Nobody (Gast)


Lesenswert?

sid schrieb:

>
> 32bit binär:
> 0100 0000 0111 0000 0000 0000 0000 0000
>
> 0 - 10000000 - 11100000000000000000000
> vorzeichen - exponent - mantisse(ohne hidden bit)
>
> dezimaler exponent:
> 128 minus bias(127) = 1
> höchster Exponent ist demnach 1
>
> hinzufügen des hidden bit(immer 1) zur mantisse
> 1,11100....
> und verschieben des Kommas um den höchsten Exponenten (hier 1)
> 11,1100....
> das ist also die binäre 'lesbare' Darstellung deiner gesuchten
> Dezimalzahl.
>

>
> 'sid

Verstehe diese Schritte nicht.

von Rolf M. (rmagnus)


Lesenswert?

Nobody schrieb:
> Verstehe diese Schritte nicht.

Dann hast du Pech gehabt. Ich empfehle, dir eine andere Beschäftigung zu 
suchen als ausgerechnet die Programmierung. Wenn du Dinge nicht auf 
Anhieb verstehst, ist das eine Sache - keiner fällt als Experte vom 
Himmel. Aber wenn du nicht mal annähernd dazu in der Lage bist, zu 
beschreiben, wo du ein Verständnisproblem hast, sehe ich schwarz.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Nobody schrieb:
> Verstehe diese Schritte nicht.

Auch das Beispiel im Wikipedia-Artikel nicht?

Da steht im Prinzip dasselbe drin, aber etwas anders formuliert. So arg
viele Möglichkeiten, das noch einmal anders zu erklären, gibt es nicht.

Hast du auch die vorangehenden Abschnitte des Wikipedia-Artikels
gelesen? Dort werden die Grundlagen erklärt und ein paar wichtige
Begriffe definiert.

Das Ganze gibt es auch noch etwas ausführlicher hier:

  https://de.wikipedia.org/wiki/Gleitkommazahl#Darstellung

Wenn das alles nicht hilft, fehlen dir vermutlich ein paar Grundlagen
wie Dualsystem, Potenzierung usw. Aber auch hierzu hat Wikipedia etwas
zu bieten:

  https://de.wikipedia.org/wiki/Dualsystem
  https://de.wikipedia.org/wiki/Potenz_(Mathematik)

Darf ich fragen, welche Schule du besuchst bzw. besucht hast?

von Nobody (Gast)


Lesenswert?

sid schrieb:
> oh man.. also noch weiter vorkauen, ehrlich?..
>
> 32bit binär:
> 0100 0000 0111 0000 0000 0000 0000 0000
>
> 0 - 10000000 - 11100000000000000000000
> vorzeichen - exponent - mantisse(ohne hidden bit)
>
> dezimaler exponent:
> 128 minus bias(127) = 1
> höchster Exponent ist demnach 1
>
> hinzufügen des hidden bit(immer 1) zur mantisse
> 1,11100....
> und verschieben des Kommas um den höchsten Exponenten (hier 1)
> 11,1100....
> das ist also die binäre 'lesbare' Darstellung deiner gesuchten
> Dezimalzahl.




Verstehe folgende Sachen nicht:

1) Woher erkenne ich ob es vom Typ ein single oder double ist?
2) Bei der Berechnung des dezimalen Exponenten. Woher kommt die Zahl 
128?

von sid (Gast)


Lesenswert?

Nobody schrieb:
> sid schrieb:
>
>>
>> 32bit binär:
>> 0100 0000 0111 0000 0000 0000 0000 0000
>>
>> 0 - 10000000 - 11100000000000000000000
>> vorzeichen - exponent - mantisse(ohne hidden bit)
>>
>> dezimaler exponent:
>> 128 minus bias(127) = 1
>> höchster Exponent ist demnach 1
>>
>> hinzufügen des hidden bit(immer 1) zur mantisse
>> 1,11100....
>> und verschieben des Kommas um den höchsten Exponenten (hier 1)
>> 11,1100....
>> das ist also die binäre 'lesbare' Darstellung deiner gesuchten
>> Dezimalzahl.
>>
>
>>
>> 'sid
>
> Verstehe diese Schritte nicht.

Au weh.. kann es sein, dass Du sagen wir gesondert betreut zur Schule 
gingst?

Okay..
die binärdarstellung ist von Dir, ich habe nur die erste Null
hinzugefügt um sie auf 32bit zu vervollständigen (da diese NULL das 
Vorzeichen der gesuchten Zahl darstellt)

in der Zweiten Reihe habe ich nur für dich kenntlich gemacht
welche Teile dieser binären darstellung was bedeuten,
die erste NULL eben das Vorzeichen, die nächsten acht Bit den 
Exponentnen, und alle folgenden die Mantisse (den eigentlichen Wert)

binär 10000000 ist dezimal 128 (der exponent inkl des bias von 127)
substraktion kannst Du doch bestimmt... 128-127 = 1

Die Mantisse (11100000000000000000000) hat einen hidden bit, der IMMER 
eins ist und nach links gehört!
der Wert lautet also 111100000000000000000000
alle Nullen rechts von der letzten eins (niedrigstem gesetzen bit) kann 
man ignorieren
1111 ist also alles um das wir uns kümmern müssen.
wissend, dass wir den höchsten Exponenten von 1 haben
können wir sofort rechnen.
2^1, 2^0, 2-^, 2^-2 mehr Ziffern hat die binärzahl ja schon nicht

wollen wir das besser lesbar für uns HUmanoide, dann können wir ein 
Komma hinter den 2^0 bit setzen (also aus 1111 [wissend um den 
exponentnen] wird  11,11 [das komma markiert 2^0])

Noch genauer kann ich es wirklich nicht erklären fürchte ich,
schon jetzt gerate ich in Rage ob Deiner Auffassungsgabe...

Wenn Du es noch immer nicht begreifst,
fürchte ich Du bist in der Tat auf Lernhilfen
und gesonderte Betreuung angewisen;
ich wär damit dann raus.

'sid

von Nobody (Gast)


Lesenswert?

Habe nur noch eine offene Frage:

Woher erkenne ich ob es vom Typ ein single oder double sein muss?

von W.S. (Gast)


Lesenswert?

Nobody schrieb:
> Verstehe diese Schritte nicht.

Das Denken ist nicht so deine Sache, gelle?
Also:
Wat is ne Gleitkommazahl?
Das ist ein Vorzeichen, eine Mantisse und ein Exponent zur Basis 2, denn 
wir sind ja hier im Binären. Damit ist die Zahl eben

Vorzeichen,  Mantisse * 2 hoch (Exponent-Offset)

Der Offset ist zumeist 80h bzw. 128 und damit ist der Wert des 
Exponenten zu verstehen als 2 hoch (Exponent-128). Damit kann man mit 
einem Byte (0..255) den Exponentenbereich von 2 hoch -128 bis 2 hoch 
+127 überstreichen.

Damit die Mantisse immer die maximal mögliche Anzahl von Bits fassen 
kann, ist sie normiert, d.h. sie ist IMMER in einem gewissen Bereich, 
der je nach Implementation von 0.5 bis 0.999999.... oder von 1.0 bis 
1.99999.... gehen kann.

Wenn ich mich recht erinnere, dann gilt für IEEE Konformität letzterer 
Bereich, also Mantisse ist immer 1.0 bis 1.999999etc. Damit ergibt sich 
binär die Mantisse mit folgenden Bits:
MSB = 1.0
dann 0.5
dann 0.25
dann 0.125
dann 0.0625
... usw bis zum LSB eben immer die Hälfte des vorherigen Bits

Nun ist eine anständige GK Zahl immer normiert, also wenigstens 1.0 in 
der Mantisse. Da liegt der Gedanke nahe, daß man das Bit für die 1.0 ja 
IMMER gesetzt hat, also kann man das beim Speichern der GK-Zahl auch 
weglassen und den Platz dieses Bits für was anderes nehmen. Stichwort: 
Hidden Bit.

Jetzt können wir uns den Aufbau etwa so vorstellen, vom MSB an abwärts:
1
VEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
2
^\_______/\_______________________/
3
| exponent   Mantisse ohne ihr MSB
4
|- Vorzeichen
5
6
V = Vorzeichen,
7
E = Exponent,
8
M = Mantisse
Das macht 4 Bytes aus und nun kannst du dir deine Zahl aus den obigen 4 
Bytes selbst bilden.

Anmerkung: Das IEEE Format wird nicht überall verwendet, ich z.B. habe 
bei meiner GK-Lib für die PIC16 as Vorzeichen an die Stelle des Hidden 
Bits gesetzt und die Mantisse von 0.5 bis 0.999999... gehen lassen. Das 
machte sich in diesem speziellen Falle eben besser und sieht so aus:
EEEEEEEE VMMMMMMM MMMMMMMM MMMMMMMM

Aber für's generelle Prinzip ist das unerheblich.

W.S.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Nobody schrieb:
> Woher erkenne ich ob es vom Typ ein single oder double sein muss?

Single ist 32 Bit lang, double 64 Bit. 0x40700000 ist eine 32-Bit-Zahl
(8 Hex-Ziffern à 4 Bit), also single.

: Bearbeitet durch Moderator
von sid (Gast)


Lesenswert?

W.S. schrieb:
> Prinzip ... unerheblich.

Wow, deine Erklärung hat sogar mich verwirrt :D

'sid

von Wolfgang (Gast)


Lesenswert?

Nobody schrieb:
> In dem Artikel geht es darum eine Dezimalzahl in Binär umzuwandeln. Ich
> will eine Hexzahl (float) in Dezimal umwandeln und nicht in Binär.

Schön - divide et impera

IEEE Float ist ein Binärformat. Du wirst also nicht umhin kommen, dein 
Problem zu zerlegen in Float -> X und X -> Dezimal.
Als erstes empfiehlt es sich zu überlegen, welche Darstellung für X 
günstig ist.

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.