【问题标题】:Understanding 32 bit floats了解 32 位浮点数
【发布时间】:2020-09-04 13:50:38
【问题描述】:

我正在努力更好地理解计算机中的浮点数。在阅读 32 位浮点数时,我发现一般来说,32 点浮点数的构造如下:

  • 1 位用于正/负。
  • 为尾数保留 23 位。这意味着我们可以有 2^23 个唯一尾数,有 7 个有效数字。
  • 8 位为指数保留。我读到的内容是“2^8 数字的一半可用于正指数,而 2^8 可用于负指数”。我还读到指数可以从 10^-38 -> 10^38 变化。

我对此有几个问题..

  • 我不明白为什么一半的指数位是正数,一半是负数。如果 8 位中的第一个用于指示正​​数或负数,就不能有更高的精度,就像浮点架构中的第一位一样。那么可能有 2^7 个正指数和 2^7 个负指数?
  • 有了 2^7,10^38 是从哪里来的?它们大不相同。
  • 如果尾数为 2^23,为什么有效数字限制为 7 个有效数字?这本书指出这是因为 2^23 与 10^7 相似,但它们似乎相距甚远,我不确定为什么会这样限制?

【问题讨论】:

  • 谢谢马克。我编辑了这个问题,但我应该包括的是我还看到指数范围是 10^-38ths -> 10^38。这似乎与 2^7th 大不相同。你知道这是从哪里来的吗?
  • 啊,当然。我知道它代表了指数,但是当我计算数字时并没有包括它。再次感谢!

标签: architecture floating-point precision 32-bit floating-accuracy


【解决方案1】:

1 位用于正/负。

是的。

为尾数保留 23 位。这意味着我们可以有 2^23 个唯一尾数,有 7 个有效数字。

23 位用于包含有效数字的主要编码的字段。另一位通过指数字段编码。完整的数学有效数有 24 位。 (“有效数”是浮点表示的小数部分的首选术语。“尾数”是对数小数部分的旧术语。尾数是对数的;加上尾数会乘以所表示的数字。有效数是线性的; 加到有效数字上加到所代表的数字上。)

8 位为指数保留。

是的。

我读到的内容是“2^8 中的一半可用于正指数,而 2^8 可用于负指数”。

这是不正确的。停止使用该信息来源。

我还读到指数可以在 10^-38 -> 10^38 之间变化。

不,用这种格式表示的有限数的范围大约是-3.4•1038到+3.4•1038,最小的正数表示的正常数约为1.7•10-38。这些只是碰巧通过格式获得的值。它们没有明确编码到其中。

我不明白为什么一半的指数位是正数,一半是负数。

指数字段以下列方式编码一个值。指数字段的八位被解释为无符号二进制整数,E。那么:

  • 如果 E 为 255,则浮点数据表示无穷大或 NaN。 (详情如下)。
  • 如果 E 为 0,则浮点数据表示零或 次正规数
  • 否则,减去偏差 127。字段值E表示指数e = E-127。

如果 8 位中的第一个用于指示正​​数或负数,就不能有更高的精度,就像浮点架构中的第一位一样。那么可能有2^7个正指数,2^7个负指数?

这个问题源于关于指数的错误前提。除 255 外,指数字段的所有值都用于表示特定数字。 255 确实放弃了代表更多数字的机会,以换取在 NaN 中包含一些信息(见下文)。

有了 2^7,10^38 是从哪里来的?这些是完全不同的。

由于 255 用于表示无穷大和 NaN,因此用于表示有限数的最大 E 为 254。其对应的 e 为 254−127 = 127。这用于作为两个的指数。 2127 约为 1.7•1038。此外,有效数字可能表示接近 2 的值,因此表示的组合值可以大到大约 3.4•1038。 “10^38”源于对细节的疏忽。

如果尾数为 2^23,为什么有效数字限制为 7 个有效数字?书上说是因为 2^23 和 10^7 差不多,但是好像相差很远,不知道为什么会这样限制?

二进制浮点格式不包含任何十进制数字。有些人“衡量”他们的精确度是“大约”他们保留了多少十进制数字。回想一下,IEEE-754 binary32 格式的实际有效位是 24 位。 224 ≈ 107.22,所以有人说24位有效数字代表“大约”7.22个十进制数字。但是,并不是所有的七位十进制数都可以转换为 binary32,然后再转换回十进制而不会丢失至少一位,所以这是一个不好的测量。误导人,不宜使用。

要解码 IEEE-754 二进制 32 数据,让 S 为符号位,E 为 8 个指数位为无符号整数,F 是 23 个主要有效位,作为无符号整数。令 s 为 (−1)S,因此如果 S 为 0,则为 +1,如果S 是 1。

  • 如果E为255,F为0,则数据表示+∞或-∞,s•∞。
  • 如果 E 为 255 且 F 不为 0,则数据表示 NaN(非数字)。在许多实现中,如果 F 的高位为 0,则它是一个信令 NaN(在算术中使用时会产生异常,否则为安静的 NaN。F 的其余位 可用于其他目的,例如记录有关 NaN 起源的信息。
  • 如果0 E s•2E-127•(1 +F•2-23)。这些是正常的数字。
  • 如果E为0,则数据表示s•21−127•(0+F •2-23)。这些是次正规数(和零)。注意两个变化:2 的指数中的 E 被替换为 1,小数部分的前导位从 1 变为 0。

【讨论】:

  • 谢谢埃里克。我在 stackoverflow 上问了两个问题,你都回答了。
猜你喜欢
  • 2011-12-14
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多