Hallo Leute,
knacke heute erneut an so einer Aufgabe und mir fehlt der Kniff.
Geht ums Gleitkommaformat. Ich soll mit Hilfe einer Gegebenen Basis,
Mantisse-Stellen, Exponent-Stellen die kleinste und größte darstellbare
Zahl finden.
z. B.
Basis: 2, Matnisse: 9-Stellen, Exponent 4 Stellen.
Ich weiß das man generell einen Wert so ermitteln kann.
Mantisse * Basis^exponent
Unser Prof. hat mal in der Vorlesung ein Beispiel gegeben dazu.
kleinster Exponent: 1000 = -8 (verstehe ich)
Kleinster Mantissen Wert: 100000000 (klar, bei 9 Stellen).
Und dann hat er einfach gesagt:
Randbedingung: 1/2 <= m < 1
=> 1/2 * 2^-8 * 2^-9 ist demnach die kleinste darstellbare Zahl.
Ok . Mir ist schon irgendwie klar, dass 1/2 jetzt die Matnisse ist,
dann wird einfach mit negativen Exponenten und der negativen Stellenzahl
der Mantisse mulitpliziert. Aber ist das auch so ?
Was ist denn die größte darstellbare Zahl? Eigentlich kenne ich nur die
Randbedingung: 1 <= m < 2 ! Dann müsste ich ja einen Wert nehmen, der
so nah wie möglich an der 2 ist, aber kleiner bleibt... Aber das scheint
mir irgendwie ... schwer.
Oder wäre die größte positive darstellbare Zahl in dem Fall einfach 1 *
2^7 * 2^9 (9 Stellen, 7 als Exponent weil 0111) ?
Ich bedanke mich vielmals :) !
Kukuku schrieb:> Kleinster Mantissen Wert: 100000000 (klar, bei 9 Stellen).
Wenn denormalisierte Mantissen zulässig sind, dann 000000001.
> Dann müsste ich ja einen Wert nehmen, der> so nah wie möglich an der 2 ist
111111111 ist so dicht dran an 2, wie die Mantisse zulässt.
Hallo,
erstmal Danke für deine Antworten. Ganz ehrlich, ich weiß es auch nicht.
In diesem Aufgabentypus steht z. B. einfach:
In dieser Aufgabe geht es um die binäre Gleitkommadarstellung mit
9-stelliger Mantnisse und 4 stelligen Exponent.
1) Was ist die kleinste positive darstellbare Zahl?
2) Was ist die größe positive darstellbare Zahl?
für 1) hat in der Vorlesung einfach oben genannte Rechnung angegeben und
gemeint, für Fall 2) müsste man die mantnisse und den Exponenten nur
möglichst groß wählen.
Daher hätte ich jetzt geschlossen statt 1/2 * 2^-8 * 2^-9 für die
kleinste positive darstellbare Zahl dann einfach 1/2* 2^7 * 2^9
?
Das Problem, ist dass wir diese Rechnungen auch noch in Technische
Grundlagen haben und in einem anderen Fach, und jeder Prof. macht das
irgendwie ein bisschen anders, so dass ich das Große Ganze nicht auf die
Kette kriege.
Kukuku schrieb:> kleinste positive darstellbare Zahl dann einfach 1/2* 2^7 * 2^9
Was immer das auch ist, es ist weder die kleinste positive darstellbare
Zahl noch die grösste.
Raten ist zwar auch ein Ansatz, aber ob das zum Erfolg führt?
Insbesondere wenn dann jemand die peinliche Frage stellt, wie du dazu
kommst.
Kannst es ja mal im ersten Denkansatz dezimal probieren. Also was
rauskommt, wenn ein Zahlenformat
#,######## * 10^+/-####
zur Verfügung steht.
> Das Problem, ist dass wir diese Rechnungen auch noch in Technische> Grundlagen haben und in einem anderen Fach, und jeder Prof. macht das> irgendwie ein bisschen anders, so dass ich das Große Ganze nicht auf die> Kette kriege.
Pfiffig die Leutchens. Das bedeutet nämlich, dass man es verstehen muss.
Nicht bloss nachplappern oder Werte in Formeln einsetzen. ;-)
Nur so nebenbei: Haben deine Zahlen auch ein Vorzeichen?
A. K. schrieb:> Pfiffig die Leutchens. Das bedeutet nämlich, dass man es verstehen muss.> Nicht bloss nachplappern oder Werte in Formeln einsetzen. ;-)
Ja, nur hilft mir das nichts wenn das nur anskizziert ist im Script und
ich die Aufgaben nicht rechnen kann, weil ich auch keinen Vergleich
habe, was richtig ist.
So hilft mir das natürlich nichts. Naja, lern ich halt auf Lücke - auch
egal. Hab mich da heute schon den ganzen Tag mit beschäftigt,macht
keinen Sinn.
Kukuku schrieb:> Ja, nur hilft mir das nichts wenn das nur anskizziert ist im Script und> ich die Aufgaben nicht rechnen kann, weil ich auch keinen Vergleich> habe, was richtig ist.
Mit der Frage, ob deine Gedanken richtig sind, kommst du hier vielleicht
schon weiter. Aber zumindest bei mir nicht mit der Frage nach dem
fertigen Lösungsweg. Das ist kein Sadismus, sondern liegt daran, dass
ich persönlich weit bessere Erfahrungen damit gemacht habe, Sachverhalte
zu verstehen, als irgendwas auswendig zu lernen.
Ich hatte übrigens oben mal auf Denormals hingewiesen. Ist dir klar was
das ist? Ist in diesem Zusammenhang nicht ganz unwichtig. Wenn du auf
Tipps absolut nicht eingehst - was erwartest du dann?
Das Problem ist, ich würde es ja gerne verstehen. Und es wäre auch toll,
wenn ich dazu im Skript auch mal eine richtige Erklärung finden würde.
Aber ich finde immer nur diese angeschnittenen Beispielaufgaben, das
macht mich irre.
Also ok. Ich versuche es nochmal mit strenger Logik^^
Exponent 4 Stellen
Mantnisse 9 Stellen
Basis: 2
Ich suche die kleinste positive darstellbare Zahl.
Also muss ich den Exponent und die Mantisse möglichst klein wählen.
Kleinster Exponent = 1000 = -8 Aufgrund der
Zweierkomplementdarstellung.
Kleinste Mantisse 000000001 = 1
Da ich ja aber eine Kommezahl brauche hat meine Mantnisse den Wert
1 / 512 = 1 / 2^9
jetzt habe ich
m = 1/2^9
exponent -8
basis 2
Nach der allgemeinen Formel basiert ja die Darstellung ja auf folgendem.
z = m * b^e
Das wäre dann in meinem Fall
z = 1/2^9 * 2^-8 <=> 1 * 2^-9 * 2^-8 = 1 * 2^-17
Aber eigentlich ist ja meine Randbedingung 1/b <= m < 1
Also 1/2 <= m < 1 und demnach wäre meine Rechnung eigentlich
1/2 * 2^-17 - also 1/2 statt 1. Weil 1/2 eben der kleinste Wert wäre.
Aber das ist der Punkt, der mich verwirrt. Ich habe zwar 1/2 als
Randbedingung, aber 1/2 lässt sich Binär doch gar nicht darstellen !
Warum ist das dann so?
War mein Ansatz und meine Überlegung richtig?
Und ja ich weiß das du auf Denormals hingewiesen hast. Entschuldige !
Wir müssen hier in Programmierung das nicht "normalisieren", wie wir das
in Technische Grundlagen machen müssen.
Kukuku schrieb:> Kleinster Exponent = 1000 = -8 Aufgrund der> Zweierkomplementdarstellung.
Passt.
> Kleinste Mantisse 000000001 = 1> Da ich ja aber eine Kommezahl brauche hat meine Mantnisse den Wert> 1 / 512 = 1 / 2^9
Passt auch, aber (A), siehe unten.
> z = 1/2^9 * 2^-8 <=> 1 * 2^-9 * 2^-8 = 1 * 2^-17
Na also, geht doch.
> Aber eigentlich ist ja meine Randbedingung 1/b <= m < 1> Also 1/2 <= m < 1 und demnach wäre meine Rechnung eigentlich>> 1/2 * 2^-17 - also 1/2 statt 1. Weil 1/2 eben der kleinste Wert wäre.
Und damit sind wir bei den Denormals. Wenn die Mantisse zwingend
entweder 0 (gibts auch ;-), oder >= 0,5 ist, dann sind denormalisierte
Mantissen nicht zulässig, aber (A) ist genau das.
> Aber das ist der Punkt, der mich verwirrt. Ich habe zwar 1/2 als> Randbedingung, aber 1/2 lässt sich Binär doch gar nicht darstellen !
Aber klar doch. Bei einer Mantisse, die zwischen 0,5 (inkl) und 1 (ixkl)
liegt, ist 100000000 (binär) exakt 0,5 (dezimal). Weil der Punkt links
davon liegt, es also 0,100000000 ist.
Kukuku schrieb:> Und ja ich weiß das du auf Denormals hingewiesen hast. Entschuldige !> Wir müssen hier in Programmierung das nicht "normalisieren", wie wir das> in Technische Grundlagen machen müssen.
Keine Ahnung was du damit sagen willst. Der Witz ist nur, dass eine der
Aussagen oben, die du deinem Prof zuschreibst, nur korrekt ist, wenn
denormalisierte Mantissen zulässig sind (also 0,000000001). Und
andererseits bei denormalisierten Mantissen die Forderung m >= 0,5
verletzt ist. Um diesem Dilemma zu entfliehen muss man wohl Letzteres
eher als Hinweis denn als zwingende Forderung verstehen, also m < 0,5
zulassen. Oder zu einem anderen Ergebnis kommen als der Prof. Du hast
die Wahl. ;-)
Wenn die Mantisse entweder 0,000000000 oder 0,1xxxxxxxx sein darf, nie
aber 0,0xxxxxxxx mit mindestens einem x != 0 (d.h. nur normalisierte
Mantissen), dann kommt für die kleinste darstellbare Zahl != 0 ein
anderes Ergebnis heraus, als wenn jede Mantisse zulässig ist.
Daher also die beiden Möglichkeiten für die kleinste Zahl != 0:
(a) denormalisiert: m=0,000000001 e=1000
(b) normalisiert: m=0,100000000 e=1000
Wirst dich für eine davon entscheiden müssen.
Am anderen Ende, also der grössten Zahl ist es einfacher. Da gibts keine
Denormals.
Kukuku schrieb:> Aber das ist der Punkt, der mich verwirrt. Ich habe zwar 1/2 als> Randbedingung, aber 1/2 lässt sich Binär doch gar nicht darstellen !
Um das mal anders zu formulieren: Deine Mantisse ist eine Festkommazahl.
0 Vorkommastellen und 9 Nachkommastellen. Und grad so, wie 0,1 dezimal
1/10 ist, ist 0,1 binär 1/2.
Was du wirklich nicht endlich binär darstellen kannst ist 1/10
(dezimal).
Danke für die ausführlichen Antworten ! Das ist aber tatsächlich ein
Dilemma. Wahrscheinlich hast du recht, und es ist nur so eine pi-mal
Daumen Anweisung, die man dann wohl in seinem Fach so hinnehmen soll.
Ich nehme es jetzt einfach mal hin, dass die Randbedingung 1/2 ist und
ich beim kleinsten Wert dann auch von diesem ausgehe. Hoffe ich. Es
steht ja leider nichts im Skript darüber. Das ist ja das Haare raufende.
Danke übrigens.
Ich versuche es jetzt mal mit dem größten Wert
Exponent: 0111 = 7
Mantisse 011111111 = 255
, ich möchte das komma ja wieder verschieben. Da das auch immer so
macht, wirds dann halt schon passen.
Meine Mantisse wäre also 255/2^9
Nach der Formel z = m * b^e
wäre es dann 255/2^9 * 2^7 = 255/2^2 = 255/4 = 63.75
63.75 wäre die größte positive Darstellbare Zahl. Ist das so? Das kommt
mir irgendwie so... wenig vor ? Oder hab ich jetzt wieder einen Bock
geschossen ?
A. K. schrieb:> NB: Was ist das eigentlich für ein Studium?
Informatik mit schwerpunkt Technische Informatik
(Automatisierungstechnik/ Softwareentwicklung). Bin aber auch erst im 1.
Semester, vielleicht stell ich mich auch noch zu doof an x)
Kukuku schrieb:> Exponent: 0111 = 7
Korrekt.
> Mantisse 011111111 = 255
Hossa... Jetzt wirds spannend und die Verwirrung offenkundig.
Mantissen in Zweierkomplementdarstellung bin ich noch nie begegnet. Die
werden eigentlich immer als sign/magnitude dargestellt - daher übrigens
meine Frage nach dem Vorzeichen. Will hoffen, dass das hier auch so
gemeint ist, sonst lösch (fast) alles was ich bisher geschrieben habe.
Jedenfalls ist im üblichen Fall, also mit separatem Vorzeichen und
vorzeichenloser Mantisse, die grösste Mantisse 111111111, also
0,111111111, also fast 1.
A. K. schrieb:> und grad so, wie 0,1 dezimal 1/10 ist, ist 0,1 binär 1/2.
Und warum kann der blöde Windows-Taschenrechner mit Zahlen wie 0,1 binär
nicht umgehen, aber mit 0,1 dezimal, obwohl er sich zwischen Binär- und
Dezimaldarstellung umschalten läßt.
Klar..sorry, die ist ja gar nicht im Zweierkomplement. Blödsinn von mir.
also
511/2^9 * 2^7 dann = 511 * 2^-9 * 2^7 = 511 * 2^2 = 2044.
Kommt mir immer noch klein vor ^^ aber sollte dann ja stimmen?
k.A. schrieb:> Und warum kann der blöde Windows-Taschenrechner mit Zahlen wie 0,1 binär> nicht umgehen, aber mit 0,1 dezimal, obwohl er sich zwischen Binär- und> Dezimaldarstellung umschalten läßt.
Weil dein Taschenrechner binär offenbar nur ganzzahlig rechnet. Nur
wirst du kaum das Unvermögen deines Taschenrechners als Beweis für eine
postulierte Nichtexistenz binärer Kommazahlen heranziehen können. :-)
Kukuku schrieb:> Kommt mir immer noch klein vor ^^ aber sollte dann ja stimmen?
Passt schon. Bist du bei der kleinsten Zahl weiter gekommen? Bzw. den
beiden Möglichkeiten.
Dass dieser Bereich klein ist, liegt an dem kleinen Exponenten mit
seinen 4 Bits. Im beliebte IEEE Format sinds ein paar Bits mehr.
Kukuku schrieb:> Wieder so ein bock. 511 * 2^-2 = 127.75. Jetzt aber - oder XD ?
Vorher wars richtig. Du solltest wirklich dazu übergehen, die Mantisse
als Kommazahl zu schreiben, statt als Ganzzahl. Sonst stolperst du
permanent über die eigenen Füsse.
Die Mantisse "111111111" ist tatsächlich die Kommazahl 0,111111111
(binär), was du oben korrekt als 511/2^9 beschrieben hast. Und
entspricht damit der Forderung m < 1.
A. K. schrieb:> Kukuku schrieb:>> Wieder so ein bock. 511 * 2^-2 = 127.75. Jetzt aber - oder XD ?>> Vorher wars richtig. Du solltest wirklich dazu übergehen, die Mantisse> als Kommazahl zu schreiben, statt als Ganzzahl. Sonst stolperst du> permanent über die eigenen Füsse.>> Die Mantisse "111111111" ist tatsächlich die Kommazahl 0,111111111> (binär), was du oben korrekt als 511/2^9 beschrieben hast. Und> entspricht damit der Forderung m < 1.
Ok, klar das entspricht der Forderrung. Nur die Aufgabe sagt, ich solle
die größte Zahl finden. Aber du hast recht, das verwirrt nur das
auszuschreiben. Ich werde einfach dann schreiben 511/2^9 * 2^7
Mehr will er ja auch gar nicht sehen.
Ich danke dir vielmals das du mir soviel geholfen hast !
Kukuku schrieb:> Ne ok doch nicht klar. 511/2^9 * 2^7 ist doch jetzt richtig oder?> Weil du sagtest das vorher, aber das stimmt ja net.
Doch, das passt schon. Dein 511 * 2^-2 = 127.75 passte nicht.
A. K. schrieb:> Kukuku schrieb:>> Ne ok doch nicht klar. 511/2^9 * 2^7 ist doch jetzt richtig oder?>> Weil du sagtest das vorher, aber das stimmt ja net.>> Doch, das passt schon. Dein 511 * 2^-2 = 127.75 passte nicht.
Irgendwie bin ich gerade verwirrt. Warum soll das denn nicht passen?
Die Formel sagt doch m * b^e , das 511/2^9 * 2^7 ist.
<=> 511 * 2^-7 * 2^9 = 511 * 2^-2
511/2^9 * 2^7 ist doch 127.75 Also ist das doch äquivalent. So habe ich
doch ein bei der kleinsten positiven darstellbaren Zahl gerechnet.
Das was ich vorher geschrieben hatte ( 511/2^9 * 2^7 dann = 511 * 2^-9
* 2^7 = 511 * 2^2 = 2044). Kann doch nicht stimmen, weil ich die
Potenzgesetze falsch angewendet habe. Das ist doch 511 * 2^(-9+7)
Kukuku schrieb:> Irgendwie bin ich gerade verwirrt. Warum soll das denn nicht passen?
Tu es, sorry. Ich hatte gedacht, du beziehst dich bei der Korrektur auf
die Mantissenrechnung, nicht das Gesamtergebnis. Und hatte deine
Rechenkünste nicht komplett nachvollzogen.
Alles klar !
Dann nochmal wirklich vielen Dank an dieser Stelle.
Liebe Grüße und noch einen schönen restlichen Nikolaus-Tag :) Und
natürlich Wochenende.
A. K. schrieb:> Nur wirst du kaum das Unvermögen deines Taschenrechners
Das ist nicht "mein" Taschenrechner, sondern der, der mit einem der am
weitesten verbreiteten PC-Betriebssysteme mit über 20 Jahren
Entwicklungsgeschichte von einem Softwarekonzern mit Firmensitz in
Redmond/USA ausgeliefert wird :-(