单精度浮点数中的第24个分数位在哪里?IEEE 754

7

今天我在进行一些位运算时发现自己需要刷新一下浮点数知识!

一开始感觉还不错,直到看到这个:

... 小数的23位二进制数字出现在内存格式中,但总精度为24位

我反复阅读了几次,但仍然无法理解第24位在哪里,我注意到了一个“二进制点”,所以我认为它是介于“尾数”和“指数”之间的中点。

我不是很确定,但我相信作者说的是这个位:

         Binary point?
             |
s------e-----|-------------m----------
0 - 01111100 - 01000000000000000000000
           ^ this

十进制中的一个数字可能是4.25,其中.是“小数点”。在二进制(非浮点数)中,该数字将变为100.01,我们称此处的.为“二进制点”。然而,二进制点实际上与浮点格式并没有太多关系。 - Mooing Duck
@MooingDuck 我知道“基数点”的概念,但我无法理解为什么会有人使用“二进制点”。感谢您的澄清! - gifnoc-gkp
3个回答

18

由于归一化,第24位是隐含的。

将有效数字左移(并且每次位移时指数减1),直到有效数字的最高位为1。

然后,由于最高位是1,只有其他23位实际存储。

也有可能是非规格化数。指数以"偏置"格式的有符号数存储,这意味着它是一个无符号数,其中范围的中间被定义为01。因此,在8位情况下,它被存储为从0到255的数字,但是0被解释为-128,128被解释为0,而255被解释为127(我可能有一些错误,但你懂我的意思)。

如果在归一化过程中将其减少到0(表示实际指数值为-128),则归一化停止,并将有效数字按原样存储。在这种情况下,由于非规格化,隐式位被视为0而不是1。

大多数浮点运算硬件基本上都是设计为假设数字将被归一化,因此它们假定隐式位为1。在计算过程中,它们检查是否存在非规格化数,如果存在,则大致相当于引发异常,并重新启动计算以考虑该异常。这就是为什么使用非规格化数进行计算通常比其他情况下慢得多的原因。


  1. 你可能会问为什么要使用这种奇怪的格式:IEEE浮点数(像许多其他数字一样)是设计用来确保如果将其位模式视为相同大小的整数,则可以将它们作为带符号的2补码整数进行比较,而它们仍然以正确的顺序排序为浮点数。由于数字的符号在最高有效位(就像2补码整数一样),因此被视为符号位。指数的位存储为接下来最重要的位--但是,如果我们对它们使用2补码,则小于0的指数将设置数字的第二个最重要位,这将导致看起来像一个大数作为整数。通过使用偏置格式,更小的指数使该位保持清晰,并且更大的指数设置该位,因此作为整数的顺序反映了作为浮点数的顺序。

好的,我现在明白了!非常感谢您迅速的回答! - gifnoc-gkp
5
@PaulR: 而对于零来说,要将有效数字的最高位变为1直到左移是相当困难的。(另外,IEEE 754标准使用“subnormal”这个术语,而不是“denormal”) - Eric Postpischil
1
零是次正规数。 :-) - R.. GitHub STOP HELPING ICE
2
有符号整数比较不能用于浮点数。负浮点数的值与您想要的相反。 - R.. GitHub STOP HELPING ICE
老实说,如果你陷入了非规范化区域,速度可能是你最不用担心的问题 :) - Emmet
@Emmet 在迭代算法中,有些值趋近于零,但由于迭代算法是近似算法,它们实际上永远不会达到零,这可能会成为一个真正的问题。 - plugwash

5
通常情况下,浮点数的最高位始终为1,因此不需要将其存储在任何地方。原因是,如果最高位不是1,则表示您选择了错误的指数来表示它;通过将尾数位左移并使用较小的指数,可以获得更高精度。
唯一的例外是非规格化数,它们由指数字段中的所有零位(最低可能指数)表示。在这种情况下,尾数没有隐含的最高位1,并且随着值接近零,精度逐渐降低。

1
对于“普通”的浮点数,存储在浮点变量中的数字(忽略符号)为 1. mantissa * 2exponent-offset。前导的1未存储在变量中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接