了解 32 位浮点数

Understanding 32 bit floats

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

我对此没什么疑问..

1 bit for positive/negative.

是的。

23 bits are reserved for the mantissa. This means we can have 2^23 unique mantissas, with 7 significant digits.

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

8 bits are reserved for the exponent.

是的。

What I read says that "half of the 2^8 numbers can be used for positive exponents, while 2^8 can be used for the negative".

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

I also read that the exponent can vary from 10^-38 -> 10^38.

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

I don't understand why half the exponent bits are positive, and half our negative.

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

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

Couldn't there be more precision if the first of the 8 bits was used to indicate positive or negative, like the first bit in the floating point architecture. Then there could be 2^7 positive exponents, and 2^7 negative exponents?

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

With 2^7, where does 10^38 come from? Those are vastly different.

由于255用于无穷大和NaN,所以用来表示有限数的最大E是254,对应的e是254 −127 = 127。这用作两个的指数。 2127约等于1.7•1038。此外,尾数可能表示接近二的值,因此表示的组合值可能大到约3.4•1038。 “10^38”源于对细节的不重视。

If the mantissa is 2^23, why is the significant digits limited to 7 significant digits? The book indicates that it's because 2^23 is similar to 10^7, but they seem to be pretty far apart, and I'm not sure why that would be the limit?

二进制浮点格式不包含任何十进制数字。有些人根据他们保留的“大约”小数位数来“衡量”他们的精度。回想上面的内容,IEEE-754 binary32 格式的实际有效位数是 24 位。 224 ≈ 107.22,所以有人说24位有效数字代表“大约”7.22位十进制数字。但是,并非所有七位十进制数都可以转换为 binary32 然后再转换回十进制而不丢失至少一位数字,因此这是一个糟糕的测量。误导人,所以不应该使用。

要解码 IEEE-754 binary32 数据,令 S 为符号位,E 为 8 个指数位作为无符号整数,F 是 23 个主要有效位,作为无符号整数。令s为(−1)S,所以如果则为+1如果 S 为 1,则 S 为 0 和 −1。

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