计算机中浮点数的表示方法采用该标准——IEEE浮点表示
基本概念
形如x * 2y这样的数,可以通过给定 x 和 y 的值来表示。
IEEE 浮点标准用 V = ( − 1 ) s ∗ M ∗ 2 E V = (-1)^s * M * 2^E V=(−1)s∗M∗2E 的形式来表示一个数:
- 符号(sign) s 决定这个数是正数还是负数(s=0正数,s=1负数)。
- 尾数(significand)M是一个二进制小数。
- 阶码(exponent)E的作用是对浮点数加权,权重是2的E次幂。
下图分别表示(C语言中)单精度浮点float 和双精度浮点 double的表示格式。
- float格式中,s、exp、和frac字段分别为1位、k=8位和n=23位,得到一个32位的表示。
- double格式中,s、exp、和frac字段分别为1位、k=11位和n=52位,得到一个64的表示。
给定了位表示,根据exp的值,被编码的值可以分成三种不同的情况。
情况1:常规值
也就是最普遍的情况。exp 的位模式不全是0,也不全是1(单精度数值为255,双精度值为2047)。阶码的值为 E = e - Bias 。
e 是无符号数,位表示为: ek-1 … e1e0 因此它的值在 1 ~ 254 之间(单精度),1~2046之间(双精度);
Bias 是偏置值:等于 2k-1 - 1 (单精度是127,双精度是1023)
因此,E 的值就可以得到一个范围(包含边界): -126 ~ 127(单精度),-1022 ~ 1023(双精度)
小数字段 frac 被解释为描述小数值 f ,0 ≤ f ≤ 1
二进制表示为 0.fn-1 … f1f0
由此尾数被定义为 M = 1 + f (也叫做隐含的以1开头的表示)
情况2:非常规的值
当阶码全都为0时,所表示的数是非规格化的形式。
阶码值是 E = 1 - Bias
尾数值是 M = f,也就是小数字段的值,不包含隐含的1。
情况3:特殊值
当阶码位全为1时,表示特殊值。
- 无穷大:阶码位全为1,小数位全为0
- NaN:表示不是一个数(Not a Number),即阶码位全为1,小数位不全为0。
表示方法
示例1
以一个6位二进制为固定长度的范围。来表示一些数,这样方便我们更好的理解。假定s、exp、frac字段分别为 1位,3位,和2位。
这样我们得到一个6位二进制表示法:s=1,k=3,n=2,我们以此来表示一些数。
示例分析
在表示数之前,我们先来分析一下这个6位的二进制。
由阶码k的位分布情况,能得到常规值,和非常规值。他们是平滑过渡的。
先确定偏置量 Bias = 2k-1 - 1 = 3 (k=3)
下面我们来了解他们能表示的数的范围和值。不考虑符号位。
公式: V = ( − 1 ) 0 ∗ M ∗ 2 E V = (-1)^0 * M * 2^E V=(−1)0∗M∗2E
请考虑下面的二进制位,符号位的值固定为1,下面的计算都会省略
非常规情况
E = 1 - Bias = -2
M = f
[------] 0 000 00 (最小值的二进制位分布)
V = 0 ∗ 0 = 0 16 V = 0 * 0= \dfrac{0}{16} V=0∗0=160
[------] 0 000 01
V = 1 4 ∗ 1 4 = 1 16 V=\dfrac{1}{4} * \dfrac{1}{4}=\dfrac{1}{16} V=41∗41=161
[------] 0 000 10
V = 2 4 ∗ 1 4 = 2 16 V=\dfrac{2}{4} * \dfrac{1}{4}=\dfrac{2}{16} V=42∗