2010-09-27 12 views
15

Hey alle, schnelle Frage: Wie wird ein .NET decimal Typ binär im Speicher dargestellt werden?Binäre Darstellung eines .NET Dezimal

Wir alle wissen, wie Gleitkommazahlen gespeichert werden und die auf diese Weise die Gründe für die Ungenauigkeit davon, aber ich kann keine Informationen über decimal mit folgenden Ausnahmen finden:

  1. offenbar genauer als Fließ- Punktzahl
  2. Takes 128 Speicherbits
  3. 2^96 + sign Bereich
  4. 28 (manchmal 29?) Gesamt signifikante Ziffern in der Anzahl

Gibt es eine Möglichkeit, das herauszufinden? Der Informatiker in mir verlangt die Antwort und nach einer Stunde Recherche kann ich ihn nicht finden. Es sieht so aus, als gäbe es entweder eine Menge verschwendeter Teile oder ich stelle mir das nur in meinem Kopf vor. Kann jemand bitte etwas Licht darauf werfen? Vielen Dank.

Antwort

30

Decimal.GetBits für die Informationen, die Sie wollen.

Grundsätzlich ist es eine 96-Bit-Ganzzahl als Mantisse, plus ein Vorzeichen-Bit, plus ein Exponent, um zu sagen, wie viele Dezimal Orte, um es nach rechts zu verschieben.

So 3,261 vertreten Sie eine Mantisse von 3261 haben würde, ein Vorzeichenbit 0 (dh positiv), und einen Exponenten von 3. Beachten Sie, dass nicht normalisiert dezimal (absichtlich), damit Sie auch vertreten 3.2610 unter Verwendung einer Mantisse von 32610 und eines Exponenten von beispielsweise 4.

Ich habe einige weitere Informationen in meinem Artikel auf decimal floating point.

+0

+1 fantastische Antwort, auf den Punkt und reich an Informationen. – JoshD

+0

@Jacob: Nein, das ist * eindeutig * nicht wahr. Da Sie mit einer Ganzzahl beginnen und mit (sagen wir) 0,1 enden können, verschiebt sich das offensichtlich nach rechts. Wenn Sie * nur * nach links verschieben könnten, könnten Sie 10, 100 usw. darstellen - aber nicht 0,1, 0,01 usw. Warten Sie in Zukunft auf ein "ack", bevor Sie die Bedeutung einer Antwort signifikant ändern. Siehe die Dokumentation für 'decimal': http://msdn.microsoft.com/en-us/library/1k2e8atx.aspx - wobei der Skalierungsfaktor als * Dividieren * der Ganzzahl gesprochen wird, was äquivalent ist, ihn zu verschieben Recht. –

+0

Entschuldigung. Für mich ist es intuitiver, wenn man daran denkt, dass der * Dezimalpunkt * nach * links * verschoben wird, aber ich sehe jetzt, dass Sie die Mantisse "verschieben". – Jacob

Verwandte Themen