深入理解计算机系统——第二章小结(4)

浮点数

一直以来我们对浮点都比较郁闷,他们在C里长期存在,但是大多数时候都被认为没意思和深奥难懂。
甚至C标准也未要求机器使用IEEE浮点,乃至 Intel IA32处理器对于浮点的特殊寄存器常常会打乱程序员思路。

这些都是这一次小结讲述说的内容。

现在大多数计算机都使用被称为IEEE浮点(IEEE floating point)的标准。 PS:IEEE读作 “I-Triple-E” .

V = (-1)^s * M * 2^E

s:符号位 1位
M:2进制小数 n位
E:2的幂,对浮点数加权 k位

对于单精度float, snk分别为1位,k=8位和n=23位。
对于双精度double,snk分别为1位,k=11位和n=52位。

根据E(exp)的值,浮点编码分为三种情况

1. 规格化值
exp非全0(数0),也非全1(数255或2047)时,指数的值被偏置(Biased),
指数域 E = e – Bias = e – 2^(k-1) + 1 e为指数域的无符号值
小数域 M = f + 1 其中 0<= f <1, 被认为是隐含的以1开头的数(implied leading 1)

2. 非规格化值
exp全0
指数域 E = 1 – Bias
小数域 M = f
非规格化数常常来表示 +0和-0 ,除了表示0值,也用于逐渐下溢出(gradual underflow)

3. 特殊数值
指数域exp E 全1
小数域 M 全0
符号位 s = 1 表示 负无穷 s = 0 表示正无穷
此时如果 小数域不全为零,这表示这个是 NaN,不是一个数(Not a Number).

此条目发表在C, 系统分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注