使用单个精度(32位):位除like this:
所以我们有 23 位的尾数/有效数。
因此我们可以表示2 ^ 23个数字(通过23位):这是8388608
- >这是7位数。
BUT
我读到尾数被标准化(尾数中的前导数字总是1 ) - 所以模式实际上是1.mmm
而仅 mmm
表示在尾数中。
例如:看这里:
表示0.75,但实际上是1.75
问题#1
所以基本上它增加了1个精确数字....不?
如果是,那么我们有8个有效!
所以为什么 msdn说:7?
问题#2
在双尾中有52位用于尾数。 (0..51)
如果我为归一化的尾数加1,那么它的2 ^ 53个可能性为:9007199254740992
(16位)
和MS确实说:15-16:
为何这种不一致?我错过了什么吗?
答案 0 :(得分:4)
它不会再添加一个十进制数字 - 只需一个二进制数字。所以不是23位,而是24位。这很方便,因为你不能用一个开头表示的唯一数字是零,而且这是一个特殊值。
简而言之,您并未查看2 ^ 24
(这是十进制数字,基数为10) - 您正在查看2 ^ (-24)
。这是float
- double
和decimal
之间最重要的区别。 decimal
是您想象的浮动,即。一个简单的指数移位,基数为10的数字。 float
和double
不是。
现在,十进制数字与二进制数字是一个棘手的问题。你错误地认识到精确度与2 ^ 24
数字有关 - 只有在你谈论的时候才会这样。 decimal
类型,实际上存储十进制值作为普通(巨大屁股)整数的小数点偏移量。
就像1 / 3
不能用十进制(0.333333...
)来编写一样,许多简单的十进制数不能精确地表示在一个浮点数中(0.2
是典型的例子)。 decimal
没有问题 - 只是2
向右移动了一位数,很容易让人感到轻松。但是,对于浮点数,您必须将此值表示为两个负幂的总和 - 0.5
,0.25
,0.125
...如果{相同则适用于{ {1}}不是2
的因子 - 每个有限二进制"十进制"可以用十进制的有限精度表示。
现在,事实上,10
可以很容易地代表一个24位十进制数字的数字 - 它只需要float
- 一个你平常日常工作中不会遇到的数字和十进制的奇怪数字。那么2 ^ (-24)
(实际上更像7
)来自哪里?很简单,只做一个7.22...
的小数对数。
2 ^ (-24)
似乎可以代表"确切地说"在0.2
只是因为每次你...将其转换为字符串,您将进行四舍五入。因此,即使数字不是float
,但是当它转换为十进制数时,它会以这种方式结束。
所有这些意味着当您需要小数精度时,您希望使用0.2
,就这么简单。这不是因为它是一个更好的计算基础,它只是因为人类使用它,如果你的应用程序给出的结果与他们在一张纸上的计算结果不同,他们就不会高兴 - 特别是在交易时用钱。会计师非常注重将所有事情都纠正到最不重要的数字。
浮点数用于不是十进制精度的地方,而是通常具有某种精度 - 这使得它们非常适合物理计算和类似物,因为你实际上并不关心数字以十进制表示相同 - 您以给定的精度工作,并且您将获得 - 24个重要的二进制和#34;小数"。
答案 1 :(得分:1)
隐含的前导1再增加一个二进制精度数字,而不是十进制数。