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

时间:2013-08-14 16:23:27

标签: c++ c ieee-754

我发现自己今天做了一些操作,我决定稍微刷新我的浮点知识!

在看到这个之前,事情已经伟大了:

  
    

...有效数的23个小数位出现在存储器格式中,但总精度为24位

  

我一次又一次地读它但是我仍然无法弄清楚第24位的位置,我注意到了binary point的某些内容所以我认为它是mantissa之间的中间点和exponent

我不太确定,但我相信他的作者正在谈论这一点:

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

3 个答案:

答案 0 :(得分:18)

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

有效数据向左移位(每个位移从指数中减去一个),直到有效数的前导位为1。

然后,由于前导位为1,实际只存储了其他23位。

还有可能存在非正规数。指数存储为“偏差”格式有符号数,表示它是无符号数,其中范围的中间定义为0 1 。因此,对于8位,它存储为0..255的数字,但0被解释为-128,128被解释为0,而255被解释为127(我可能有一个fencepost错误,但是你得到这个想法。

如果在归一化过程中,它递减到0(表示实际指数值为-128),则归一化停止,并且有效数据按原样存储。在这种情况下,从归一化的隐含位取为0而不是1.

大多数浮点硬件的设计基本上假设数字将被标准化,因此它们假设隐含位为1.在计算过程中,它们检查非正规数的可能性,在这种情况下,它们大致相当于抛出异常,并重新开始计算。这就是computation with denormals often gets drastically slower than otherwise

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

答案 1 :(得分:5)

通常(原谅双关语),浮点数的前导位始终为1;因此,它不需要存储在任何地方。原因是,如果它不是1,那就意味着你选择了错误的指数代表它;通过将尾数位向左移动并使用较小的指数,可以获得更高的精度。

一个例外是非正规数/次正规数,它由指数字段中的所有零位(最低可能指数)表示。在这种情况下,尾数中没有隐式前导1,并且当值接近零时,精度会降低。

答案 2 :(得分:1)

对于正常浮点数,存储在浮点变量中的数字是(忽略符号)1. mantissa * 2 exponent-offset 。前导1不存储在变量中。