Kleinste int-Zahl die nicht fehlerfrei zu double konvertiert werden kann?! [IEEE]

VioX

Mitglied
Hallo zusammen,


mir hat sich im Zuge einer Uni-Aufgabe folgende Frage aufgeworfen:
Es ging darum, die Frage zu beantworten, was die kleinste integer Zahl ist, die nicht fehlerfrei zu double konvertiert werden kann.

Double heißt 64 Bit, bei IEEE sieht die Verteilung ja wie folgt aus.

1 Bit = Vorzeichen
11 Bit = Exponent
52 Bit = Mantisse

Angeblich ist die Lösung: 2^53 + 1
53, weil wir noch durch das HiddenBit ein Bit geschenkt bekommen. 2^53 ist also in double darstellbar, 2^53 + 1 nicht mehr. Wenn ich das mit Python umrechne, dann stimmt das auch.
Wenn ich nun aber 53 Bits habe, wieso kann ich die nicht alle mit einer 1 belegen? Somit hätte ich die Zahl 2^54 -1 und die nächste Zahl die nicht mehr fehlerfrei konvertierbar wäre: (2^54 -1) +1, sprich 2^54.

Hoch 53 + 1 scheint definitiv richtig zu sein, aber ich kann mir nicht erklären warum das so ist.

Gibts hier Zahlenspezialisten? (Passt "Coders Talk" dazu?)


Danke schonmal!
Viele Grüße
 

sheel

I love Asm
Hi

Wenn man eine 1 nimmt und beliebig viele 0 dranhängt...
eine einstellige Zahl 1 ist 2 hoch Null
Zweistellig 10 ist 2^1
Dreistellig wäre 2^2
usw...
Die Hidden-1 und 52 Mantissenstellen (mit 0) sind 53 Stellen =2^52
Alle 53 Stellen auf 1 ergibt (2^53)-1

Einfach nur die Mantisse als int zu betrachten (und einen "neutralen" Exponent annehmen)
bringt einen bei diesen Größen also schon nicht mehr weiter.

Die Darstellung von 2^53 wäre: Die Mantisse voller Nuller und die Hidden-1 dazu
ist 2^52, dazu ein Exponent, der dem Ganzen
noch eine Zweierpotenz zusätzlich gibt = 2^52 * 2^1 = 2^53

Die Mantisse um eins erhöht (letzte Stelle 1):
(1) 00000000...0001 = 2^52 + 1
Dazu der Exponent (2^52 + 1) * 2^1 = 2^53 + 2
Damit hätte man die Darstellungen von 2^53 allein
und auch 2^53+2, aber 2^53+1...geht eben nicht.

(Die Bedeutung des Exponents ist hier verglichen zur tatsächlichen Zahl im Computer
gleich dreimal vereinfacht, aber ist hier eigentlich egal).
 

VioX

Mitglied
Hallo sheel,

erstmal danke für deine Antwort. Kann sein, dass es an der Uhrzeit und meiner Müdigkeit liegt, aber ich komm nicht ganz hinter deine Aussage.
Wieso geht folgendes denn nicht?

Code:
0  10000110011  111111111111[...]11111    [52 Mantissenbits]

s = 0 --> Positive Zahl
e = 52 --> Komma hinter hiddenBit bis ganz ans Ende der Mantisse schieben (nach der 52. bzw 53. eins)
Mantisse = 1 + 52 * 1


Wenn ich diese Zahl nun zurück rechnen würde, käme ich auf 2^54 -1
Oder steh ich jetzt komplett auf der Leitung?


Viele Grüße
 

sheel

I love Asm
Prinzipiell richtig, du hast dich am Schluss nur wieder verzählt.
8 Einser = 255 = 2^8 -1

Mantisse = 1 + 52 * 1
53 Einser = 2^53 -1
Nicht 2^54 -1

Um noch eins höher auf 2^53 selbst zu kommen muss man also schon den Exponent weiter ändern.
Vorher hast du das Komma genau hinter die Mantisse geschoben,
jetzt noch eins weiter: Eine 0 gedanklich noch drangehängt.
Die letzte Ziffer der Mantisse ist damit nur die Vorletzte der ganzen Zahl
->Ändern macht einen Unterschied um 2
Von 2^53 zu 2^53 +2
 

Neue Beiträge