Может кто-нибудь сказать мне, как System.Decimal представлен в битах памяти? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь посмотреть, как различные числа с плавающей запятой хранятся в памяти.

Сначала я посмотрел на System.Double (доступный по ключевому слову Double в vb.net), который, как мне кажется, я понимаю. Он хранится следующим образом:

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

, где

  • $ \ pm $ требует один бит.

  • $ a \ in [0, \ sum_ {k = 1} ^ {52} 2 ^ {- k}] $ и потребляет $ 52 $ бит.

  • $ b \ in [-2 ^ {10} +2, 2 ^ {10} -1] $ и использует оставшиеся $ 11 $ биты.

Таким образом, в целом, для этого представления требуется $ 64 $ битов.

Примечание. $ 11 $ битов может представлять в общей сложности $ 2 ^ {11} = 2048 $ различных чисел, тогда как набор возможностей $ b $ равен $ | [-2 ^ {10} +2, 2 ^ {10} -1] | = 2046 $. Оставшиеся два двоичных представления $ All [0]: = "00000000000" $ и $ All [1]: = "11111111111" $ опущены, чтобы охватить особые случаи $ \ pm 0. $, $ \ pm \ infty $ и различные типы не числа, $ NaN $.

  • $ I $ равно $ 1 $, за исключением особых случаев $ b = All [0] $, где он равен $ 0, так что t потребляет любой дополнительный бит.

  • Как если бы $ b = All [0] $ и $ a $ также имели все свои биты $ 0 $, то результирующее число представляет $ \ pm0 $.

  • Аналогично, если $ b = All [1] $ и $ a $ имеют все свои биты $ 0 $, то результирующее число представляет $ \ pm \ infty $.

  • Аналогично, если $ b = All [1] $ и $ a $ имеют некоторые конкретные биты 1, то результирующие числа представляют различные типы $ NaN $.

  • Точно так же, если $ b = All [0] $ и $ a $ имеет некоторые конкретные биты 1, результирующий $ b $ заменяется его минимальным значением $ -2 ^ {10} + 2 $ и так как $ I = 0 $, в этом случае он позволяет представить более близкие числа к $ 0. $ (Субнормальные числа).

Вот как я понимаю весь Double (64-битная с плавающей запятой). Теперь, когда я пытаюсь понять System.Decimal в том же духе, я не могу расшифровать все детали.

Я понимаю, что десятичная дробь имеет следующую структуру:

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

где $ a $ - 96-битное число, поэтому $ a \ in [0,2 ^ {96} -1] $, а $ b \ in [0,28] $ - это масштабирующий коэффициент, который решает, где поставить десятичную точку. Таким образом, он может хранить до $ 28 $ десятичных знаков.

В документации указано, что для этого числа требуется $ 128 $ бит. Что означает использование 96 битов для $ a $ и одного бита для знака, этот коэффициент масштабирования использует оставшиеся $ 128-96-1 = 31 $ битов. Может кто-нибудь объяснить, как этот коэффициент масштабирования использует биты $ 31 $? Предположительно у него есть два базовых представления коэффициента масштабирования или что-то в этом роде. Может кто-нибудь, кто знает, объяснить, как биты $ 31 $ используются в этом Decimal типе данных?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...