0 Daumen
80 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

+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?

+1 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.

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage sofort und kostenfrei

x
Made by a lovely community
...