Бинарное представление .NET Decimal
Как decimal
тип .NET представлен в двоичном виде в памяти?
Мы все знаем, как хранятся числа с плавающей запятой и, следовательно, причины их неточности, но я не могу найти информацию о decimal
числах, кроме следующего:
- По-видимому, более точный, чем числа с плавающей точкой
- Занимает 128 бит памяти
- 2 ^ 96 + диапазон знаков
- 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-х дюймов.