1
$\begingroup$

I am trying to look at how different floating points are stored in memory.

Firstly I looked at the System.Double (accessible by keyword Double in vb.net) which I think I understand. It is stored as follows:

$\pm (I+a)\times 2^b$

where

  • $\pm$ requires one bit.

  • $a \in [0,\sum_{k=1}^{52}2^{-k}]$ and consumes $52$ bits.

  • $b \in [-2^{10}+2, 2^{10}-1]$ and consumes the remaining $11$ bits.

So in total, this representation requires $64$ bits.

Note $11$ bits can represent a total of $2^{11}=2048$ distinct numbers while the set of possibilities of $b$ are $|[-2^{10}+2, 2^{10}-1]|=2046$. The remaining two binary representations of $All[0]:="00000000000"$ and $All[1]:="11111111111"$ are omitted to cover special cases of $\pm 0.$, $\pm \infty$ and different types of not a number, $NaN$.

  • $I$ is $1$ except for special cases of $b=All[0]$ where it is $0$ so doesn't consume any additional bit.

  • Like if $b=All[0]$ and $a$ also has all its bits $0$ then the resulting number represent $\pm0$.

  • Similarly, if $b=All[1]$ and $a$ has all its bits $0$ then the resulting number represents $\pm\infty$.

  • Similarly, if $b=All[1]$ and $a$ has some particular bits 1 then the resulting numbers represents various types of $NaN$.

  • Similarly, if $b=All[0]$ and $a$ has some particular bits 1 then the resulting $b$ is replaced by its minimum value $-2^{10}+2$ and since $I=0$, in this case, it allows for more closer numbers to $0.$ be represented (Subnormal numbers).

This is how I understand the entire Double (64bit floating point). Now when trying to understand the System.Decimal in the same spirit I am unable to decipher all the details.

I understand that decimal has the following structure:

$\pm a \times {10}^{-b}$

where $a$ is a 96 bit number so $a \in [0,2^{96}-1]$ while $b \in [0,28]$ is a scaling factor that decide where to put the decimal point. Thus it can store up to $28$ decimal places.

The documentation states that this number requires $128$ bits. Which means using the 96 bit for the $a$ and one bit for the sign, this scaling factor is using the remaining $128-96-1=31$ bits. Can somebody explain how this scaling factor is using the $31$ bits? It's presumingly has a base two representation of the scaling factor or something. Can someone who knows explain how the $31$ bits are used in this Decimal data type?

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/decimal-data-type

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.