Kann jemand die Darstellung von Float in Memory erklären?

20

Dies ist keine doppelte Frage, da ich die vorherige Frage gelesen habe.

Kann mir jemand beim Verständnis helfen how float values are stored in the memory.

Ich bezweifle, dass hier float-Werte enthalten ' .'( for example 3.45), wie die '.'im Speicher dargestellt werden?

Kann mich bitte jemand mit einem Diagramm klären?

user2720323
quelle
21
Wie wäre es mit der am wenigsten erwarteten Quelle Wikipedia? en.wikipedia.org/wiki/Floating_point#Internal_representation
9000
4
Und Sie können den Hauptartikel hinzufügen: IEEE Gleitkomma
mouviciel
4
Wenn Sie wie ich sind und lernen möchten
KChaloux
Es gibt eine Vielzahl unterschiedlicher Gleitkommaformate. Der IEEE-Gleitkommawert ist heutzutage der gebräuchlichste, aber nicht der einzige. Während meines Studiums musste ich das Gleitkommaformat CDC 6600 erlernen, das gegenüber IEEE einige Vorteile aufwies, wobei die größte 48-Bit-Mantisse für einfache Genauigkeit bestand. IEEE ist für eine einfache Genauigkeit auf etwa 24 Bit Mantisse beschränkt. Aus diesem Grund wird den Schülern heutzutage in jeder einführenden numerischen Methodenklasse empfohlen, "Immer double, nicht float" zu verwenden.
John R. Strohm
Siehe floating-point-gui.de und erinnere dich an diese URL
Basile Starynkevitch

Antworten:

44

Der Dezimalpunkt wird nirgendwo explizit gespeichert. Das ist ein Anzeigeproblem.

Die folgende Erklärung ist eine Vereinfachung; Ich lasse viele wichtige Details aus und meine Beispiele sollen keine reale Plattform darstellen. Es sollte Ihnen einen Eindruck davon geben, wie Gleitkommawerte im Speicher dargestellt werden und welche Probleme damit verbunden sind. Sie sollten jedoch nach aussagekräftigeren Quellen suchen, z. B. Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte .

Beginnen Sie mit der Darstellung eines Gleitkommawerts in einer Variante der wissenschaftlichen Notation, wobei Sie Basis 2 anstelle von Basis 10 verwenden. Beispielsweise kann der Wert 3.14159 als dargestellt werden

    0,7853975 * 2 2

0,7853975 ist der Signifikand , auch bekannt als die Mantisse; Es ist der Teil der Zahl, der die signifikanten Ziffern enthält. Dieser Wert wird mit der zur Potenz von 2 erhobenen Basis 2 multipliziert, um 3,14159 zu erhalten.

Gleitkommazahlen werden durch Speichern des Signifikanten und des Exponenten (zusammen mit einem Vorzeichenbit) codiert.

Ein typisches 32-Bit-Layout sieht ungefähr so ​​aus:

 3 32222222 22211111111110000000000
 1 09876543 21098765432109876543210
+-+--------+-----------------------+
| |        |                       |
+-+--------+-----------------------+
 ^    ^                ^
 |    |                |
 |    |                +-- significand 
 |    |
 |    +------------------- exponent 
 |
 +------------------------ sign bit

Wie bei Integer-Typen mit Vorzeichen gibt das höherwertige Bit ein Vorzeichen an. 0 zeigt einen positiven Wert an, 1 zeigt einen negativen an.

Die nächsten 8 Bits werden für den Exponenten verwendet. Exponenten können positiv oder negativ sein, aber anstatt ein anderes Vorzeichenbit zu reservieren, werden sie so codiert, dass 10000000 0 darstellt, also 00000000 -128 und 11111111 127 darstellt.

Die restlichen Bits werden für den Signifikanten verwendet. Jedes Bit repräsentiert eine negative Zweierpotenz von links, also:

    01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5 
          = 0,25 + 0,125 + 0,03125 
          = 0,40625

Einige Plattformen setzen ein "verstecktes" führendes Bit im Hochkomma voraus, das immer auf 1 gesetzt ist, daher liegen die Werte im Hochkomma immer zwischen [0,5, 1]. Auf diese Weise können diese Plattformen Werte mit einer etwas höheren Genauigkeit speichern (mehr dazu weiter unten). Mein Beispiel macht das nicht.

Unser Wert von 3,14159 würde also so etwas wie dargestellt werden

    0 10000010 11001001000011111100111
    ^^^
    | | |
    | | + --- Hochkomma = 0,7853975 ...
    | |
    | + ------------------- Exponent = 2 (130 - 128)
    |
    + ------------------------- Vorzeichen = 0 (positiv)

    Wert = -1 (Vorzeichen) * 2 (Exponent) * (Signifikand)
    value = -1 0 * 2 2 * 0.7853975 ...
    value = 3.14159 ...

Wenn Sie alle Bits in der Bedeutung addieren, werden Sie feststellen, dass die Summe nicht 0,7853975 beträgt. Sie kommen tatsächlich auf 0,78539747. Es sind nicht genügend Bits vorhanden, um den Wert genau zu speichern . Wir können nur eine Annäherung speichern. Die Anzahl der Bits im Hochkomma bestimmt die Genauigkeit oder wie viele Hochkommazahlen Sie speichern können. 23 Bits ergeben eine Genauigkeit von ungefähr 6 Dezimalstellen. 64-Bit-Gleitkommatypen bieten genügend Bits in der Bedeutung, um eine Genauigkeit von ungefähr 12 bis 15 Stellen zu erzielen. Beachten Sie jedoch, dass es Werte gibt, die nicht genau dargestellt werden können, egal wieviele Bits, die Sie verwenden. So wie Werte wie 1/3 nicht in einer endlichen Anzahl von Dezimalstellen dargestellt werden können, können Werte wie 1/10 nicht in einer endlichen Anzahl von Bits dargestellt werden. Da es sich bei den Werten um Näherungswerte handelt, handelt es sich bei den Berechnungen auch um Näherungswerte, und es kommt zu Rundungsfehlern.

Die Anzahl der Bits im Exponenten bestimmt den Bereich (die minimalen und maximalen Werte, die Sie darstellen können). Wenn Sie sich jedoch Ihren Minimal- und Maximalwerten nähern, vergrößert sich die Lücke zwischen darstellbaren Werten. Das heißt, wenn Sie Werte zwischen 0,785397 und 0,785398 nicht genau darstellen können, können Sie auch keine Werte zwischen 7,85397 und 7,85398 oder Werte zwischen 78,5397 und 78,5398 oder Werte zwischen 785397,0 und 785398,0 genau darstellen. Seien Sie vorsichtig, wenn Sie sehr große (betragsmäßig) Zahlen mit sehr kleinen Zahlen multiplizieren.

John Bode
quelle
"aber anstatt ein anderes Vorzeichenbit zu reservieren" Was Sie beschreiben, ist das genaue Verhalten einer vorzeichenbehafteten Ganzzahl.
Simon
6

Die .wird gar nicht gespeichert. Zunächst sollten Sie die technische Notation verstehen, die einen Faktor fester Genauigkeit und einen ganzzahligen Exponenten hat: 1ist 1,0 · 10 0 = 1.0E0, 2 ist 2.0E0, 10 ist 1.0E1usw. Dies ermöglicht die sehr kurze Notation großer Zahlen. Eine Milliarde ist 1.0E9. Der Faktor , bevor das Eist in der Regel als Fest Präzision Nummer notiert: 1.00000E9. Dies hat zur Folge, dass die Zahlen 1 Milliarde und 1 = 1.000.000.001 und 1 Milliarde in dieser Notation identisch sind, wenn die Genauigkeit nicht groß genug ist. Beachten Sie auch, dass der Faktor niemals eine führende Null benötigt. Stattdessen kann der Exponent dekrementiert werden, bis dies nicht mehr der Fall ist.

Im Speicher wird eine Gleitkommazahl ähnlich dargestellt: Ein Bit hat das Vorzeichen, einige Bits bilden den Faktor als Zahl mit fester Genauigkeit („Mantisse“), die übrigen Bits bilden den Exponenten. Wesentliche Unterschiede zur technischen Notation zur Basis 10 bestehen natürlich darin, dass der Exponent nun die Basis 2 hat. Die genaue Größe jedes Teils hängt von dem genauen Gleitkomma-Standard ab, den Sie verwenden.

amon
quelle
3
Dies ist "Wissenschaftliche Notation". "Technische Notation" ist, wenn der Exponent auf ein Vielfaches von 3 beschränkt ist.
Clement J.
7
Die Verwendung der Basis 2 ist sehr wichtig. Es bestimmt, welche Werte genau gespeichert werden können und welche nicht, und selbst wenn Sie sich nicht die Mühe machen, eine Intuition für welche Werte zu entwickeln (ich weiß, ich kann nicht), sollten Sie sich zumindest daran erinnern, dass Dezimalstellen völlig nutzlos sind Denkweise über Schwimmer.
1
@delnan: Wenn es hilft, ist jedes Bit in der Mantisse halb so groß wie das höhere Bit. Floats können also Summen negativer Potenzen von zwei speichern: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 usw., bis zur Grenze der Mantisse . Das Epsilon in einem 32-Bit- Format floatist also 2^-22 * exponentungefähr 1/4194304.
greyfade