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

浮点数的计算

浮点数的计算不具有结合性和分配性,因为浮点数会舍入,本身是一个不准确的数值

四种舍入方式

  • 向零舍入
  • 向上舍入
  • 向下舍入
  • 向偶数舍入(最低有效数位为偶数)这样平均值没有统计偏差
posted @ 2021-04-12 20:38  陌天森  阅读(78)  评论(0编辑  收藏  举报