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.
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".
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
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
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.
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
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.
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.
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
Einfach in C oder C++ im Speicher ablegen, den Pointer auf die Addresse nach float* casten und per printf oÄ ausgeben.
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.
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...
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) |
:)
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
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.
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.
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?
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?
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
Habe nur noch eine offene Frage: Woher erkenne ich ob es vom Typ ein single oder double sein muss?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.