了解 32 位浮点数
Understanding 32 bit floats
我正在努力更好地理解计算机中的浮点数。在阅读有关 32 位浮点数的过程中,我发现一般来说,32 点浮点数的构造如下:
- 1 位用于 positive/negative。
- 23 位保留给尾数。这意味着我们可以有 2^23 个独特的尾数,有 7 个有效数字。
- 8 位保留给指数。我读到的内容是 "half of the 2^8 numbers can be used for positive exponents, while 2^8 can be used for the negative"。我还读到指数可以从 10^-38 -> 10^38 变化。
我对此没什么疑问..
- 我不明白为什么一半的指数位是正数,一半是负数。如果 8 位中的第一位用于表示正或负,就像浮点体系结构中的第一位一样,那么精度会更高吗?那么可能有2^7个正指数和2^7个负指数?
- 有了2^7,10^38从何而来?这些有很大的不同。
- 如果尾数是2^23,为什么有效数字限制在7位?书上说是因为 2^23 和 10^7 很像,但是好像相差很远,不知道为什么会是这个极限?
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。
我正在努力更好地理解计算机中的浮点数。在阅读有关 32 位浮点数的过程中,我发现一般来说,32 点浮点数的构造如下:
- 1 位用于 positive/negative。
- 23 位保留给尾数。这意味着我们可以有 2^23 个独特的尾数,有 7 个有效数字。
- 8 位保留给指数。我读到的内容是 "half of the 2^8 numbers can be used for positive exponents, while 2^8 can be used for the negative"。我还读到指数可以从 10^-38 -> 10^38 变化。
我对此没什么疑问..
- 我不明白为什么一半的指数位是正数,一半是负数。如果 8 位中的第一位用于表示正或负,就像浮点体系结构中的第一位一样,那么精度会更高吗?那么可能有2^7个正指数和2^7个负指数?
- 有了2^7,10^38从何而来?这些有很大的不同。
- 如果尾数是2^23,为什么有效数字限制在7位?书上说是因为 2^23 和 10^7 很像,但是好像相差很远,不知道为什么会是这个极限?
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。