0 Daumen
317 Aufrufe

Aufgabe:

Es geht um die normalisierte Gleitkommadarstellung reeller Zahlen.

Warum hat man beim Datentyp double (64 Bits) fĂŒr die MantissenlĂ€nge 53 Bits und fĂŒr den Exponentenbereich [-1022, 1023]?


Problem/Ansatz:

Leider, habe ich immer nur gesagt bekommen, dass das so ist. Aber warum gerade diese Werte bei vorgegebenen 64 Bits? Handelt es sich hierbei um ein Optimierungsproblem? Also: Wie muss die MantissenlÀnge und der Exponentenbereich gewÀhlt werden, damit bei vorgegebener Bit-Anzahl n, der Zahlenbereich maximiert wird?

von

2 Antworten

+2 Daumen

Aloha :)

Als Speicher noch knapp war und CPUs keine eigenen Fließkomma-Berechnungen durchfĂŒhren konnten, hat man 32-Bits fĂŒr die Darstellung von Fließkommazahlen verwendet. Dabei gab es 23 Bits fĂŒr die Mantisse, 8 Bits fĂŒr den Exponenten und 1 Bit fĂŒr das Vorzeichen der Mantisse. Damit kam man auf eine Genauigkeit von etwa 6 gĂŒltigen Stellen und auf eine 10er-Potenz von \(10^{-38}\) bis \(10^{38}\). Der entsprechende Datentyp wurde ĂŒbleicherweise float genannt.

SpĂ€ter hat man dann 64 Bits fĂŒr die Darstellung von Fließkommazahlen verwendet, also doppelt so viele Bits. Die Anzahl der Mantissen-Bits wurde dann mit 52 so gewĂ€hlt, dass bei Berechnungen 12 gĂŒltige Stellen gewĂ€hrleistet werden konnten, also doppelt so viele wie bei float. Daher haben die 64-Bit-Fließkommatypen ihren Namen double. Der FĂŒr den Exponent bleiben dann 11 Bits ĂŒbrig und fĂŒr das Vorzeichen der Mantisse wird noch 1 Bit verwendet. Die 10er-Exponenten bei double liegen im Bereich von \(10^{-308}\) bis \(10^{308}\).

Die Aufteilung der Bit-Anzahl in Mantisse und Exponent bei double hat also historische GrĂŒnde. Das double ist im Sinne von "doppelter Genauigkeit" zu verstehen und nicht im Sinne von doppelter Bitanzahl.

von

Einverstanden. Aber warum hat man bei 32 bits den Exponenten auf den Bereich [-126, +127] festgelegt? Wenn ich nun selber anfange mit den vorgelegten Einteilungen der Bits zu arbeiten, dann komme ich auf folgendes:

8 bits fĂŒr den Exponenten ergibt diese grĂ¶ĂŸte Zahl :  $$(11111111)_2=255_{10}=2^8-1$$

Nun rechnet man aber auch mit Zahlen < 1, sodass der Exponent negativ wird. Damit komme ich folgenden Bereich fĂŒr die Exponenten: $$ \Big\{-\left \lfloor{\frac{2^8}{2}}\right \rfloor,...,\left \lceil{\frac{2^8}{2}}\right \rceil -1 \Big\}=\{-128,...,127\} $$

Also habe ich diesen Maschinenzahlbereich: F=F(2,23,-128,127)

Damit bekomme ich diesen grĂ¶ĂŸte positive Zahl: $$ \max(F)=\Big(1- \Big(\frac{1}{2} \Big)^{23}\Big)\cdot 2^{127+1}\approx 3,40\cdot 10^{38}\\\min(F)=2^{-127}\approx 2,94\cdot 10^{-39}. $$

Genauso frage ich mich, warum bei 64 bits ein Exponetenbereich von [-1022, 1023] vorliegt, statt [-1024, 1023].

Die Mantisse wird so normiert, dass das vorderte Bit stets 1 ist. Da dieses aber stets auf 1 normiert ist, braucht man es nicht zu speichern. Die gespeicherten Mantissen-Bits sind daher nur die Nachkomma-Bits:$$1,m_1m_2m_3m_4\ldots m_{23}$$FĂŒr die Mantisse gilt daher \(1\le m<2\).

Ich sehe hier den Zusammenhang nicht, warum ausgerechnet Exponetenbereich von [-1022, 1023] entsteht.

Es gibt einige besondere Werte bei Fließkommazahlen.

- Not a Number (NaN)

- Unendlich

- denormalisierte Zahlen

Zu deren Darstellung werden bestimmte Bitmuster des Exponenten verwendet, die dadurch nicht mehr fĂŒr "normale" Fließkommazahlen verfĂŒgbar sind. Wenn dich das im Detail interessiert, empfehle ich Google-Suche mit dem Stichwort "IEEE 754". Dort ist das alles ausfĂŒhrlich beschrieben.

Das habe ich auch. Aber bei keine dieser Seiten (auch auf YouTube), wird auf NACHVOLLZIEHBARER Art und Weise erklĂ€rt/gerechtfertigt, wiso der Exponentenbereich entsteht. Und auf den Seiten, auf denen ich war wird das einfach nur hingeklatscht, kurz gesagt, dass der grĂ¶ĂŸte und der kleinste Exponent reserviert sind. Aber das erklĂ€rt nicht [-1022, 1023]. FĂŒr was werden -1024 und -1023 verwendet? Warum werden diese Werte rausgenommen?

Es gibt keine ErklĂ€rung fĂŒr Deine Frage. Dass der Exponent inklusive Vorzeichen z.B. 8 Bit breit ist, wurde einfach mal so festgelegt, da steckt kein Optimum dahinter oder eine sonstige tiefgrĂŒndige Überlegung.

Bei einem Exponenten mit 11 Bit Breite entspricht der Wert 0x001 einem Exponenten von -1022 (1-1023), der Wert 0x7FE einem Exponenten von 1023 (2046-1023). Der Wert 0x000 steht fĂŒr eine negative Null, und der Wert 0x7FF fĂŒr NaN.

+1 Daumen

Aktuell verwendet man double-Typen mit unterschiedlich vielen Bits fĂŒr den Exponenten bzw. die Mantisse, die insgesamt 32/64/128 Bit benötigen.

Ein Optimum zwischen der maximalen Grösse des Exponenten und der Mantisse gibt es nicht. Ein Optimum könnte man nur dann entwickeln, wenn man die Menge der darzustellenden Zahlen einschrÀnkt. Diese EinschrÀnkung bezieht sich nicht auf ein reelles Minimum und Maximum, sondern auf die Auswahl der Zahlen in einem vorgegebenen Interval.

Eine solche EinschrĂ€nkung ist aber in Anbetracht der AnwendungsfĂŒlle unmöglich.

Ausserdem lassen sich mit dem double-Format keine reelle Zahlen darstellen, deren Dezimalanteil mit den Ziffern 1,2,3,4,6,7,8,9 endet, anders gesagt nicht mit der Ziffer 5. So ist z.B. die Zahl 0.1 nicht exakt darstellbar, ebensowenig 0.2 oder 0.574 usw.

Ebenso können mit dem double-Format keine reellen Zahlen mit Periode dargestellt werden, weil die Mantisse in allen FÀllen endlich ist. Als Beispiel ist also weder die Zahl 0.3 (siehe oben) noch die Zahl 1/3 exakt darstellbar.

Mit einer grössere Mantisse kann man lediglich den entstehenden Rechenfehler verkleinern.

P.S Und mit diesen Fehlern rechnet man Klimamodelle ...

von
P.S Und mit diesen Fehlern rechnet man Klimamodelle ...

Ja das stimmt!

Genauso wenig kann man exakt berechnen, wann der gute Mann rechts im Bild Kontakt mit dem Erdboden bekommt:

sks-cartoonsjcookuncertaintyde.jpg

Quelle: SkepticalScience.com.

Dass sich mit Maschinenzahlen reelle Zahlen nur approximieren lassen, ist mir klar, da der Computer nur endlich viele Ziffern abspeichern kann und somit Rundungsfehler entstehen.

Aber wie kommt man dann auf diese Bereichsfestlegung fĂŒr den Exponenten, bzw. fĂŒr die LĂ€nge der Mantisse? Welche GrĂ¶ĂŸe wird zuerst vorgegeben, um darauf aufbauend die weiteren (anderen) festzulegen?

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage sofort und kostenfrei

x
Made by a lovely community