CSAPP:信息的表和处理2
关键点:浮点数、浮点数运算。
二进制小数
形如表示的二进制数,其中每个位
的取值范围位0和1。这种表示方式的定义如下:
符号.变为二进制点,点的左边的位的权是2的正幂,右边的位的权是2的负幂。例如。
小数的二进制表示法只能表示那些能够被写成的数,其他的数值只能近似的表示,增加二进制的长度可以提高表示的精度。
IEEE浮点数表示
IEEE浮点标准用的形式来表示一个数:
- 符号(sign)s,决定正负,1表示负数,0表示正数
- 尾数M是一个二进制小数,他的范围是1~2-ε,或者0~1-ε
- 阶码(exponent)E的作用是对浮点数加权,这个权重是2的E次幂(E可能为负)
将浮点数的位表示划分为三个字段,分别对这些值进行编码: - 一个单独的符号位s,直接编码符号位s
- k位的阶码字段
编码阶码E
- n位小数字段
编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。
标准浮点数格式:32位和64位
在单精度(C语言float)中s,exp,frac的字段分别为1位,k=8位,n=23位,得到一个32位的表示。在双精度(C语言double)中,s,exp,frac的字段分别为1位,k=11位,n=52位,得到一个64位的表示。
根据exp的值,被编码的值可以分成三种不通的情况,规格化、非规格化、特殊值(有两个变种) 单精度浮点值的分类
- 规格化
&&
,
,e为无符号数,其位表示为
其中(单精度127,双精度1023)
小数字段frac被解释描述为小数值f,其中,其二进制表示为
,尾数
,有时这种方式也叫做隐含以1开头的表示,因此可以把M看成一个二进制表达式
- 非规格化
,阶码值
,尾数的值
,也就是小数字段的值,不包含隐含开头1
- 特殊值
当时。当小数域全为0,得到的值为无穷,
,为
,
,为
;当小数域为非零,结果为NaN(Not a Number)
浮点数转换(单精度)
根据IEEE 754标准,用科学计数法表示一个小数应该是这样的:
注意小数点前面有个1
把5.8这个10进制小数,转化为IEEE 754表示的浮点数。
1.先用科学计数法表示
15.8/2 = 2.9
22.9/2 = 1.45
所以有。
- 计算指数E(指数也有正负之分)
- 尾数frac = 0.45,转换为二进制,不断乘以2
运算 | 结果 | 整数部分 |
---|---|---|
0.8*2 | ||
0.6*2 | ||
0.2*2 | ||
0.4*2 | ||
0.8*2 | ||
0.6*2 | ||
0.2*2 | ||
0.4*2 | ||
… | … | … |
根据IEEE 754只需要23位就行。01_1100_1100_1100_1100_1100_1100_1,所以
最终浮点数表示为:
参考
1.CSAPP:2.3章浮点数表示
2.码农翻身:看完这篇文章,你肯定理解什么是浮点数了