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。