.NET decimal
类型在内存中以二进制形式表示是怎样的呢?
我们都知道浮点数是如何存储的,因此不准确,但我无法找到关于decimal
的任何信息,除了以下内容:
- 明显比浮点数更精确
- 占用128位内存
- 2^96 + 符号范围
- 数字中总共有28(有时29个)有效位数
我有什么办法可以弄清楚这个问题吗?作为一名计算机科学家,我需要这个答案。经过一个小时的尝试研究后,我找不到它。看起来要么有很多浪费的位,要么是我在脑海中的想象错误。请问有谁能为此解惑吗?
.NET decimal
类型在内存中以二进制形式表示是怎样的呢?
我们都知道浮点数是如何存储的,因此不准确,但我无法找到关于decimal
的任何信息,除了以下内容:
我有什么办法可以弄清楚这个问题吗?作为一名计算机科学家,我需要这个答案。经过一个小时的尝试研究后,我找不到它。看起来要么有很多浪费的位,要么是我在脑海中的想象错误。请问有谁能为此解惑吗?
Decimal.GetBits
可提供所需信息。
基本上,它是一个96位的整数作为尾数,加上一个符号位,再加上一个表示向右移动多少个十进制位数的指数。
因此,要表示3.261,您需要一个尾数为3261,符号位为0(即正数),指数为3。请注意,十进制数没有规范化(故意的),因此您还可以使用尾数为32610和指数为4来表示3.2610,例如。
我在我的小数浮点型文章中有更多信息。
https://www.csharpindepth.com/Articles/Decimal
一个十进制数存储在128位中,尽管只有102位是必要的。方便起见,将十进制数视为三个32位整数表示尾数,然后用一个整数表示符号和指数。最后一个整数的最高位是符号位(按照正常方式,对于负数,该位被设置为1),16-23位(高16位字的低位)包含指数。其他位必须全部清零(0)。这种表示方法是由decimal.GetBits(decimal)
给出的,它返回一个由4个整数组成的数组。