浮点数
定点数的局限性:定点数可表示的数字范围有限,又不能无限制地增加数据的长度。
浮点数的表示
一个浮点数由阶码与尾数组成,阶码反映了数值大小,尾数反映了精度。
-
阶码:常用补码或移码表示的定点整数,最多不超过两位数(99)
-
尾数:常用原码或补码表示的定点小数
-
浮点数的真值: $r^E*M$,r就是阶码的底,通常为2
-
尾数的最高位是无效值(0)会丧失精度
浮点数尾数的规格化
规格化浮点数:规定尾数的最高数值位必须是一个有效值,且阶码字段十进制值介于[1,254]
左归:尾数算数左移1位,阶码-1
右归:尾数出现溢出(双符号位为01或10)时,尾数算数右移1位,阶码+1
采用双符号位,当溢出发生时,可以挽救。更高的符号位是正确的符号位。
补码的算术左移,低位补0;补码算数右移,高位补1
规格化浮点数的特点
- 规格化的原码尾数,最高数值位一定是1
- 规格化的补码尾数,符号位与最高数值位一定相反。
浮点数标准IEEE 754
移码:补码的基础上将符号位取反。只能用于表示整数
移码=真值+偏置值(8位移码的偏置值=128D=10000000B),即2^n-1^
但偏置值可以取其他值,在IEEE 754标准中,阶码由移码表示,其偏置值取了2^n-1^-1
最小绝对值:尾数全0,阶码真值最小-126,对应移码机器数0000 0001
,此时整体的真值为1.0x2-126
最大绝对值:尾数全1,阶码真值最大值为127,对应移码机器数1111 1110
此时整体的真值为(1.1111…11)2x2127
以上皆基于单精度浮点数进行讨论,双精度浮点数同理
阶码全1全0用作特殊用途
- 当阶码全为0,尾数M不全为0时,表示非规格化小数
- 当阶码全为1,尾数M不全为0时,表示非数值
NaN
(0/0,无穷/无穷,等) - 当阶码全为0,尾数M全为0,数符为1表示-0,数符为0表示+0
- 当阶码全为1,尾数M全为0时,数符为1表示负无穷,数符为0表示正无穷
类型转换精度丢失问题
例如int
与float
类型转换,由于int
类型4字节32位表示,float
类型尾数部分只有23位表示,
故当int
类型的数据无法用23位表示完全时会导致精度丢失
但double
类型尾数部分有52位,所以int
转换为double
就可以精确表示
浮点数运算
加减运算的步骤:
- 对阶:小阶码向大阶码对齐
- 尾数加减
- 规格化:若运算结果出现非规格化则进行左归或右归
- 舍入:若只能保留6位有效尾数,若舍弃部分非0,则入1
或者四舍五入
或者直接舍弃
- 判溢出: 若规定的阶码不超过两位,则运算后阶码超出范围,则溢出(尾数溢出未必导致整体溢出,也许可以通过3,4来救)