漂浮和双重 - 重要数字 - Mantissa POV?

时间:2014-04-22 06:54:38

标签: c# floating-point double ieee-754

使用单个精度(32位):位除like this

enter image description here

所以我们有 23 位的尾数/有效数。

因此我们可以表示2 ^ 23个数字(通过23位):这是8388608 - >这是7位数。

BUT

我读到尾数被标准化(尾数中的前导数字总是1 ) - 所以模式实际上是1.mmm mmm表示在尾数中。

例如:看这里:

enter image description here

表示0.75,但实际上是1.75

问题#1

所以基本上它增加了1个精确数字....不?

如果是,那么我们有8个有效!

所以为什么 msdn说:7?

enter image description here

问题#2

在双尾中有52位用于尾数。 (0..51)

如果我为归一化的尾数加1,那么它的2 ^ 53个可能性为:9007199254740992(16位)

和MS确实说:15-16:

enter image description here

为何这种不一致?我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

它不会再添加一个十进制数字 - 只需一个二进制数字。所以不是23位,而是24位。这很方便,因为你不能用一个开头表示的唯一数字是零,而且这是一个特殊值。

简而言之,您并未查看2 ^ 24(这是十进制数字,基数为10) - 您正在查看2 ^ (-24)。这是float - doubledecimal之间最重要的区别。 decimal是您想象的浮动,即。一个简单的指数移位,基数为10的数字。 floatdouble不是。

现在,十进制数字与二进制数字是一个棘手的问题。你错误地认识到精确度与2 ^ 24数字有关 - 只有在你谈论的时候才会这样。 decimal类型,实际上存储十进制值作为普通(巨大屁股)整数的小数点偏移量。

就像1 / 3不能用十进制(0.333333...)来编写一样,许多简单的十进制数不能精确地表示在一个浮点数中(0.2是典型的例子)。 decimal没有问题 - 只是2向右移动了一位数,很容易让人感到轻松。但是,对于浮点数,您必须将此值表示为两个负幂的总和 - 0.50.250.125 ...如果{相同则适用于{ {1}}不是2的因子 - 每个有限二进制"十进制"可以用十进制的有限精度表示。

现在,事实上,10可以很容易地代表一个24位十进制数字的数字 - 它只需要float - 一个你平常日常工作中不会遇到的数字和十进制的奇怪数字。那么2 ^ (-24)(实际上更像7)来自哪里?很简单,只做一个7.22...的小数对数。

2 ^ (-24)似乎可以代表"确切地说"在0.2只是因为每次你...将其转换为字符串,您将进行四舍五入。因此,即使数字不是float,但是当它转换为十进制数时,它会以这种方式结束。

所有这些意味着当您需要小数精度时,您希望使用0.2,就这么简单。这不是因为它是一个更好的计算基础,它只是因为人类使用它,如果你的应用程序给出的结果与他们在一张纸上的计算结果不同,他们就不会高兴 - 特别是在交易时用钱。会计师非常注重将所有事情都纠正到最不重要的数字。

浮点数用于不是十进制精度的地方,而是通常具有某种精度 - 这使得它们非常适合物理计算和类似物,因为你实际上并不关心数字以十进制表示相同 - 您以给定的精度工作,并且您将获得 - 24个重要的二进制和#34;小数"。

答案 1 :(得分:1)

隐含的前导1再增加一个二进制精度数字,而不是十进制数。