IEEE 754:格式的基本原理:次正规数和正规数
IEEE 754: rationale for format: subnormal and normal numbers
有人可以澄清一下吗:
- 为什么次正规数的格式是
±(0.F) × 2^-126
而不是 ±(1.F) × 2^-127
?
- 为什么正常数字的格式是:
±(1.F) × 2^exp
而不是 ±(11.F) × 2^exp
,或者 ±(10.F) × 2^exp
?
浮点数格式使用符号(− 或 +)、指数(某个范围内的整数 emin 到 emax,包括在内),以及一个基数为 p 的数字的有效数字b,其中 b 是格式的固定基数,p 称为精度。我们将考虑二进制格式,其中 b 是两个
设小数位数为f0,f−1, f−2,…f 1−p,所以有效数为sum−p fi•bi,以及表示的值是 (−1)s•be•sum−p fi• bi,其中s有点符号和 e 是指数。
如果f0为零,我们可以从求和中省略它,表示的值等于(−1)s•be•sum−p fi•b i = (−1)s•be−1•sum−pfi•b i+1 = (−1)s•be−1•sum1−p fi−1•bi .因此,当f0为零,而e不是emin,这个数有两种表示方式。对它们都进行编码会很浪费,因此我们需要一种不对这两种表示进行编码的编码方案。
我们做到了:
- 一些值 E 编码指数 e。 s和f−1到f的值1−p直接存储为位
- 如果E为零,e为emin 和 f0 为零。
- 若E不为零,则e为E− bias 和 f0 是一个,其中 bias 是 1−emin.
- (E的特殊值可能会被保留来表示无穷大和NaN,这里不再讨论。)
这种表示和这种编码方案回答了以下问题:
Why exactly the format of subnormal numbers is ±(0.F) × 2− 126 and not ±(1.F) × 2−127?
形式为 ±(1.F) × 2−127 的次正规数将无法包含零,并且会包含不在格式表示的数字中的数字,因为他们的非零数字低于所选集合中最低的非零数字。 (第一段描述的形式最低位对应bemin+(1−p),而形式为 ±(1.F) × 2−127 的数字] 的最低数字对应于 bemin−1+( 1−p).)
Why exactly the format of normal numbers is: ±(1.F) × 2exp and not, say, ±(11.F) × 2exp, or, say, ±(10.F) × 2exp?
小数点(或“小数点”)在尾数中的位置无关紧要,只要它是固定的即可。如本文所用,在第一位数字之后使用小数点描述的表示等效于在最后一位数字之后或任何其他位置使用小数点的表示,并对指数范围进行适当调整:同一组数字是表示和算术性质是相同的。所以,在考虑 1.F 和 11.F 的区别时,我们并不关心小数点在哪里。但是,我们确实关心代表了多少位数字。浮点格式使用具有固定位数的表示。 11.F 比 1.F 多一位,我们没有理由对其进行编码。
至于 11.F 和 10.F 之间的区别,存在 normal/subnormal 区别的原因是因为在算术上有相同数字的两种表示形式 if第一个数字是零 并且指数不是最小值。将一种形式指定为正常形式允许我们消除这些重复表示。但是11.F和10.F代表的是不同的数字,所以没有重复要剔除,也没有理由说其中一个是正常的,另一个不是。
我使用简化示例检查了两种格式的属性。为了简单起见,我使用格式 0.F × 10^-2
和 1.F × 10^-3
,其中 F
有 2 个十进制数字,没有 ±
.
最小值(非零)/最大值:
Format Min value (non-zero) Max value
0.F × 10^-2 0.01 × 10^-2 = 0.0001 0.99 × 10^-2 = 0.0099
1.F × 10^-3 1.00 × 10^-3 = 0.001 9.99 × 10^-3 = 0.00999
这是图示:
这里我们看到从值 0.001
开始格式 1.F × 10^-3
不再允许表示更小的值。但是,格式 0.F × 10^-2
允许表示较小的值。这是放大版本:
结论:从图形表示中我们看到格式 0.F × 10^-2
相对于格式 1.F × 10^-3
的属性是:
- 提供更多动态范围:
log10(max_real / min_real)
:1.99 vs 0.99
- 精度较低:可以表示的值较少:
100 vs 900
尽管有 less precision
,但 IEEE 754 似乎更喜欢 more dynamic range
。因此,这就是为什么次正规数的格式是 ±(0.F) × 2^-126
而不是 ±(1.F) × 2^-127
.
有人可以澄清一下吗:
- 为什么次正规数的格式是
±(0.F) × 2^-126
而不是±(1.F) × 2^-127
? - 为什么正常数字的格式是:
±(1.F) × 2^exp
而不是±(11.F) × 2^exp
,或者±(10.F) × 2^exp
?
浮点数格式使用符号(− 或 +)、指数(某个范围内的整数 emin 到 emax,包括在内),以及一个基数为 p 的数字的有效数字b,其中 b 是格式的固定基数,p 称为精度。我们将考虑二进制格式,其中 b 是两个
设小数位数为f0,f−1, f−2,…f 1−p,所以有效数为sum−p fi•bi,以及表示的值是 (−1)s•be•sum−p fi• bi,其中s有点符号和 e 是指数。
如果f0为零,我们可以从求和中省略它,表示的值等于(−1)s•be•sum−p fi•b i = (−1)s•be−1•sum−pfi•b i+1 = (−1)s•be−1•sum1−p fi−1•bi .因此,当f0为零,而e不是emin,这个数有两种表示方式。对它们都进行编码会很浪费,因此我们需要一种不对这两种表示进行编码的编码方案。
我们做到了:
- 一些值 E 编码指数 e。 s和f−1到f的值1−p直接存储为位
- 如果E为零,e为emin 和 f0 为零。
- 若E不为零,则e为E− bias 和 f0 是一个,其中 bias 是 1−emin.
- (E的特殊值可能会被保留来表示无穷大和NaN,这里不再讨论。)
这种表示和这种编码方案回答了以下问题:
Why exactly the format of subnormal numbers is ±(0.F) × 2− 126 and not ±(1.F) × 2−127?
形式为 ±(1.F) × 2−127 的次正规数将无法包含零,并且会包含不在格式表示的数字中的数字,因为他们的非零数字低于所选集合中最低的非零数字。 (第一段描述的形式最低位对应bemin+(1−p),而形式为 ±(1.F) × 2−127 的数字] 的最低数字对应于 bemin−1+( 1−p).)
Why exactly the format of normal numbers is: ±(1.F) × 2exp and not, say, ±(11.F) × 2exp, or, say, ±(10.F) × 2exp?
小数点(或“小数点”)在尾数中的位置无关紧要,只要它是固定的即可。如本文所用,在第一位数字之后使用小数点描述的表示等效于在最后一位数字之后或任何其他位置使用小数点的表示,并对指数范围进行适当调整:同一组数字是表示和算术性质是相同的。所以,在考虑 1.F 和 11.F 的区别时,我们并不关心小数点在哪里。但是,我们确实关心代表了多少位数字。浮点格式使用具有固定位数的表示。 11.F 比 1.F 多一位,我们没有理由对其进行编码。
至于 11.F 和 10.F 之间的区别,存在 normal/subnormal 区别的原因是因为在算术上有相同数字的两种表示形式 if第一个数字是零 并且指数不是最小值。将一种形式指定为正常形式允许我们消除这些重复表示。但是11.F和10.F代表的是不同的数字,所以没有重复要剔除,也没有理由说其中一个是正常的,另一个不是。
我使用简化示例检查了两种格式的属性。为了简单起见,我使用格式 0.F × 10^-2
和 1.F × 10^-3
,其中 F
有 2 个十进制数字,没有 ±
.
最小值(非零)/最大值:
Format Min value (non-zero) Max value
0.F × 10^-2 0.01 × 10^-2 = 0.0001 0.99 × 10^-2 = 0.0099
1.F × 10^-3 1.00 × 10^-3 = 0.001 9.99 × 10^-3 = 0.00999
这是图示:
这里我们看到从值 0.001
开始格式 1.F × 10^-3
不再允许表示更小的值。但是,格式 0.F × 10^-2
允许表示较小的值。这是放大版本:
结论:从图形表示中我们看到格式 0.F × 10^-2
相对于格式 1.F × 10^-3
的属性是:
- 提供更多动态范围:
log10(max_real / min_real)
:1.99 vs 0.99
- 精度较低:可以表示的值较少:
100 vs 900
尽管有 less precision
,但 IEEE 754 似乎更喜欢 more dynamic range
。因此,这就是为什么次正规数的格式是 ±(0.F) × 2^-126
而不是 ±(1.F) × 2^-127
.