7

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

事情进展顺利,直到我看到这个

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

我一遍又一遍地阅读它,但我仍然无法弄清楚第 24 位在哪里,我注意到关于 a 的一些东西,binary point所以我认为它是介于 themantissa和 the之间的一个点exponent

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

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

3 回答 3

18

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

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

然后,由于前导位是 1,因此实际上只存储了其他 23 位。

也有可能是非正规数。指数存储为“偏差”格式的有符号数,这意味着它是一个无符号数,其中范围的中间定义为01。因此,对于 8 位,它存储为 0..255 中的一个数字,但 0 被解释为 -128,128 被解释为 0,255 被解释为 127(我可能有一个栅栏错误,但你明白了)。

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

大多数浮点硬件的设计基本上假设数字将被归一化,因此它们假定隐含位为 1。在计算过程中,它们检查非规范数字的可能性,在这种情况下,它们大致相当于抛出一个例外,并在考虑到的情况下重新开始计算。这就是为什么使用非正规的计算通常会比其他方式慢得多


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

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

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

于 2013-08-14T16:28:38.220 回答
1

对于普通的浮点数,存储在浮点变量中的数字是 (ignoring sign) 1. mantissa * 2exponent-offset。前导 1 不存储在变量中。

于 2013-08-14T16:29:34.013 回答