浮点数

一:转换
如:十进制数12.34,多项式表示: 1*10^1 + 2*10^0 + 3*10^(-1) + 4*10^(-2)
化简为二进制表示:
整数部分:除2取余,直到商为0,倒序取余
表达式    商     余 
12/2       6       0
6/2         3       0
3/2         1       1
1/2         0       1 
结果为
 1100
小数部分: 乘2取整,直到小数部分为0或满足精度后(截取),顺序取值
表达式           积               整数部分  
0.34*2           0.68            0
0.68*2           1.36            1
0.36*2           0.72            0
0.72*2           1.44            1
0.44*2           0.88            0
0.88*2           1.76            1
0.76*2           1.52            1
0.52*2           1.04            1
0.04*2           0.08            0
0.08*2           0.16            0
0.16*2           0.32            0
0.32*2           0.64            0
0.64*2           1.28            1
0.28*2           0.56            0
0.56*2           1.12            1
0.12*2           0.24            0
0.24*2           0.48            0
0.48*2           0.96            0
0.96*2           1.92            1
0.92*2           1.84            1
0.84*2           1.68            1  -- 第21位
..... 
结果很可能是一个无穷尽数,假设这里只取20位,因第21位为1,故产生进位,结果为 0101 0111 0000 1010 0100
综上,整数部分 + 小数部分
得十进制12.34的二进制可近似地表示为 1100.0101 0111 0000 1010 0100

二:存储
现在已经将十进制数12.34转化成二进制,那么计算机是如何表示的呢?
这与科学计数法十分相似,如

十进制科学计数法可表示为 (-1)*S * M * 10^E
S为符号位,1表示负数,0表示正数
M为尾数,范围 1<=M<10,如(1.2, 9.234等)
E为指数(幂)
如 12.34 可表示为 (-1)*0 * 1.234 * 10^1

类似地,二进制科学计数法可表示为 
(-1)*S * M * 2^E,尾数 1<=M<2,如 
1)  1100.01010111 可表示为 (-1)*0   *   1.10001010111  *   2^3 (小数点左移3)
2)  -0.00110           可表示为 (-1)*1   *   1.10                    *   2^(-3) (小数点右移3位)

a. 可见指数E因左移右移,而或正或负,为避免指数为负数,在存储时会加上偏移量
单精度时为 127,双精度时为 1023
比如指数E为 (-3),则存储时E 127+(-3) = 124,在取值时再减去相应的偏移量还原数据
b. 因为尾数1<=M<2总是 1.xxx 的形式,为节省空间,是不保存整数部分的1的,如M=1.01,实际保存时M=01

图片 

三 举例
写出十进制数 12.34 的单精度存储形式 (保留20位,第21位是1,产生进位,而不是直接截断)
1) 转化二进制 
1100.01010111000010100100
2) 写成科学计数法形式 (-1)*S * M * 2^E,
= (-1)*0  * 
1.10001010111000010100100  * 2^3
符号位 S = 0,
尾数M = 
1.10001010111000010100100(表示时) = 10001010111000010100100(存储时),不保存相等的整数位1
指数E = 127 + 3 = 130 = 10000010 (为避免指数出现负值,加上单精度偏移量 127)
3) 实际存储格式为 0 10000010 10001010111000010100100
= 0100 0001 0100 0101 0111 0000 1010 0100 
= 0x 41 45 70 a4 

四 总结
综上,有以下结论
1) 浮点数是不精确的
2) 取值范围依赖于指数部分E,单精度类型为8位,范围为-127~128 (有符号的,可能左移,也可能右移),所以最大取值 2^128=3.4E38
3) 有效位数是指尾数M,单精度类型为23位,所以最大有效位是2^23= 8388608(共7位)
4) 相对于定点数,表示范围更大,但运算也更复杂

猜你喜欢

转载自liang-hr.iteye.com/blog/2367491