Бинарное представление .NET Decimal

Как decimal тип .NET представлен в двоичном виде в памяти?

Мы все знаем, как хранятся числа с плавающей запятой и, следовательно, причины их неточности, но я не могу найти информацию о decimal числах, кроме следующего:

  1. По-видимому, более точный, чем числа с плавающей точкой
  2. Занимает 128 бит памяти
  3. 2 ^ 96 + диапазон знаков
  4. 28 (иногда 29?) Всего значащих цифр в числе

Есть ли способ, которым я могу понять это? Информатик требует от меня ответа, и после часа попыток исследования я не могу его найти. Похоже, что либо много потраченных впустую бит, либо я просто представляю это неправильно в моей голове. Кто-нибудь может пролить свет на это, пожалуйста?

Ответы

Ответ 1

Decimal.GetBits для необходимой информации.

В основном это 96-битное целое число, как мантисса, плюс бит знака, плюс показатель, чтобы указать, сколько десятичных знаков сдвинуть его вправо.

Итак, чтобы представить 3.261, у вас будет мантисса 3261, знаковый бит 0 (то есть положительный) и показатель степени 3. Обратите внимание, что десятичная дробь не нормируется (намеренно), поэтому вы также можете представить 3.2610, используя мантисса 32610 и показатель степени 4, например.

У меня есть дополнительная информация в моей статье о десятичной плавающей запятой.

Ответ 2

https://www.csharpindepth.com/Articles/Decimal

Как хранится десятичная дробь?

Десятичная запоминается в 128 битах, хотя только 102 строго необходимы. Десятичное число удобно рассматривать как три 32-разрядных целых числа, представляющих мантиссу, а затем одно целое число, представляющее знак и показатель степени. Верхний бит последнего целого числа является знаковым битом (обычным образом, с битом, установленным (1) для отрицательных чисел), а биты 16-23 (младшие биты старшего 16-битного слова) содержат показатель степени. Все остальные биты должны быть очищены (0). Это представление задается с помощью decimal.GetBits(decimal) который возвращает массив из 4-х дюймов.