在学习浮点数的表示之前,先看一下二进制和十进制之间的转换。再来学习IEEE754标准的浮点数。
十进制转二进制
对于十进制整数转换位2进制小数。
例如125转换为二进制小数方法为除二取余。
125/2=62 余数1
62/2=31 余数0
31/2=15 余数1
15/2=7 余数1
7/2=3 余数1
3/2=1 余数1
1/2=0 余数1
所以转换的二进制数为111_1101。
十进制整数转换为二进制小数。整数部分除二取余,小数部分乘二取整。
例如125.125
整数部分为125二进制表示为111_1101
小数部分为0.125
0.125*2=0.250 取整为0留小数部分0.250
0.250*2=0.500 取整为0留小数部分0.500
0.500*2=1.000 取整为1留小数部分0.000
小数部分表示为001
所以对于十进制小数125.125转换为二进制小数为111_1101.001
二进制小数转换为十进制数据
例如1111101.001转换为十进制
整数部分1111101转换为十进制数为:
(1111101)2 = (1 × 26) + (1 × 25) + (1 × 24) + (1 × 23) + (1 × 22) + (0 × 21) + (1 × 20) = (125)10小数部分0.001转换为十进制为:
(0.001)2 = (0 × 20) + (0 × 2-1) + (0 × 2-2) + (1 × 2-3) = (0.125)10
浮点数的表示范围
运算结果大于最大正数时称为正上溢,小于绝对值最大负数时称为负上溢,正上溢和负上溢统称上溢。
数据一旦产生上溢,计算机必须中断运算操作,进行溢出处理。
当运算结果在0至最小正数之间时称为正下溢,在0至绝对值最小负数之间时称为负下溢,正下溢和负下溢统称下溢
数据下溢时,浮点数值趋于零,计算机将其当作机器零处理。
这种产生上下溢的行为,往往是在运算中导致的
IEEE754标准的浮点数格式
以32位浮点数标准为例
S:数符,0为正1为负。
阶码e:8位,阶码=阶码真值+127。阶码采用移码来表示,即阶码真值=e-127。
尾数m:23位,采用隐含尾数最高位1的表示方法,实际尾数为24位,尾数真值=1+尾数。
这种格式的非0浮点数真值为:
关于IEEE754浮点数和十进制数之间的转换
十进制数转为IEEE754标准浮点数
例如将十进制数据10.125转换为IEEE754标准单精度浮点数(32位)格式
- 将十进制数据10.125转换为二进制数据为
- 阶码E=3(真值)+127(偏置值)=130(移码),转换为二进制数为10000010。
- 结果0(符号位)+10000010(阶码e)+010001000000000000000000(23位尾数)
- 结果表示为二进制数010000010010001000000000000000000,十六进制表示为0x41220000
IEEE754标准浮点数(32位)转换位10进制数
例如将IEEE754单精度浮点数0x41220000转换位十进制数
- 将IEEE754单精度浮点数0x41220000转换为二进制形式为010000010010001000000000000000000
- 符号位s=0。
- 阶码10000010表示阶码值为十进制数130
- 尾数010001000000000000000000转换为十进制数为
IEEE754浮点数表示的范围
格式 | 最值 |
单精度 | s=0或1;e=1;m=0; 正最小值 负最大值 s=0或1;e=254;m=0.111...1; 正最大值 负最小值 |
双精度 | s=0或1;e=1;m=0; 正最小值 负最大值 s=0或1;e=2046;m=0.111...1; 正最大值 负最小值 |
对于IEEE754的阶码全为0和全为1时有特殊的含义。
在先不考虑阶码全为0和全为1时,那么阶码的取值范围为[-126,127]
阶码 | 真值 |
0 | 保留 |
1 | -126 |
… | |
127 | 0 |
128 | 1 |
… | |
254 | 127 |
255 | 保留 |
在阶码真值范围在[-126,127]时,尾数任意。
对于阶码全为0和全为1的情况如下
最小绝对值:尾数全为0,阶码真值最小-126,对应的阶码为00000001,此时的真值为
只有当阶码时真值才为
当阶码e全为0时,尾数M不全为0时,表示非规格化小数
当阶码e全为0时,尾数M全为0时,表示真值±0
当阶码e全为1时,尾数全为0时,表示无穷大±∞
当阶码e全为1时,尾数不全为0时,表示非数NaN(not number)