CSAPP第二章(下)
浮点数
float = (-1)^S * FRAC * 2^EXP(四个字节)
在内存中依次是:S(符号),EXP(阶码),FRAC(尾数)
分别占用:1位,8位,23位
double = (-1)^S * 2^EXP* FRAC(八个字节)
在内存中分布和float一样
分别占用:1位,11位,52位
浮点数的数值可以分为四种
规格化:阶码不是全0或者全1
非规格化:阶码和尾数全是0
无穷大:尾数位0,阶码全是1
不正确的数:阶码全是1,尾数非0
规格化的数值
阶码区不全0或者全1
V = (-1)^S * FRAC * 2^(exp - 偏置)
float偏置= 2^(8-1) -1 = 127
double偏置= 2^(11-1) -1 = 1023
所以对于float,EXP在-126到127之间
对于double,EXP在-1022到1023之间
尾数区
FRAC = 1.frac
非规格化的数值
case1:符号位为0,阶码区和尾数区全都是0,V = +0
case2:符号位为1,阶码区和尾数区全都是0,V = -0
这样可以用来表示接近0的数
V = (-1)^S* 2^(1-偏置) * (0.frac)
特殊值
阶码数全是1,尾数为0
V = (-1)^S * 2^(全1)* (全0)
根据符号的不同分别为正负无穷
不正确的数值
阶码数全是1,尾数非0
V = (-1)^S * 2^(全1)* (非0)
浮点数到整形数的转换
如把12345转换位12345.0
12345->11 0000 0011 1001 -> 1.1 0000 0011 1001 * 2^13
所以frac为1 0000 0011 1001
E = e-127(偏置) = 13
e = 140->1000 1100
所以浮点数为 0 1000 1100 1 0000 0011 1001 0000 0000 00
浮点数的计算
浮点数的计算不具有结合性和分配性,因为浮点数会舍入,本身是一个不准确的数值
四种舍入方式
- 向零舍入
- 向上舍入
- 向下舍入
- 向偶数舍入(最低有效数位为偶数)这样平均值没有统计偏差