计算机中浮点数的表示方法采用该标准——IEEE浮点表示
形如 x × 2y 这样的数,可以通过给定 x 和 y 的值来表示。
IEEE 浮点标准用 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。