2010-09-27 7 views
15

Hej wszystkim, szybkie pytanie: W jaki sposób typ .NET decimal jest reprezentowany w pamięci binarnej?Reprezentacja binarna .NET dziesiętna

Wszyscy wiemy, jak liczby zmiennoprzecinkowe są przechowywane i thusly przyczyny niedokładności ich, ale nie mogę znaleźć żadnych informacji o decimal wyjątkiem następujących:

  1. Widocznie bardziej dokładne niż o zmiennym liczba punktów
  2. przyjmuje 128 bitów pamięci
  3. 2^96 + znak zakres
  4. 28 (czasem 29?) łączne znaczących cyfr numeru

Czy mogę to rozwiązać? Naukowiec komputerowy we mnie domaga się odpowiedzi i po godzinie próbowania badań nie mogę go znaleźć. Wygląda na to, że albo jest dużo zmarnowanych kawałków, albo po prostu wyobrażam sobie, że to zło w mojej głowie. Czy ktoś może rzucić trochę światła na to? Dzięki.

Odpowiedz

30

dla potrzebnych informacji.

Zasadniczo jest to 96-bitowa liczba całkowita jako mantysa oraz bit znaku, a także wykładnik mówiący, ile liczb dziesiętnych przesuwa go w prawo.

więc reprezentować 3.261 że masz mantysa 3261, trochę Znak 0 (czyli dodatni) oraz wykładnik 3. Należy pamiętać, że po przecinku nie normalizuje się (celowo), dzięki czemu można również reprezentacji 3.2610 za pomocą mantysy o wartości 32610 i wykładniku 4, na przykład.

Mam więcej informacji w moim artykule na temat decimal floating point.

+0

+1 fantastyczna odpowiedź, od razu do sedna i bogata w informacje. – JoshD

+0

@Jacob: Nie, to * wyraźnie * nie jest prawdą. Biorąc pod uwagę, że możesz zacząć od liczby całkowitej i kończy się na (powiedzmy) 0,1, to oczywiście przesuwa się w prawo. Gdybyś mógł * tylko * przesunąć w lewo, mógłbyś reprezentować 10, 100 itd. - ale nie 0.1, 0.01 itd. W przyszłości, poczekaj na "potwierdzenie", zanim zmienisz znacząco znaczenie odpowiedzi. Zobacz dokumentację 'decimal': http://msdn.microsoft.com/en-us/library/1k2e8atx.aspx - gdzie współczynnik skalowania mówi się o * dzieleniu * liczby całkowitej, co jest równoważne przesunięciu go do dobrze. –

+0

Moje przeprosiny. Dla mnie bardziej intuicyjne jest myślenie o przesunięciu * przecinka dziesiętnego * do * lewej *, ale teraz widzę, że odnosisz się do "przesuwania" mantysy. – Jacob