一:转换
如:十进制数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) 相对于定点数,表示范围更大,但运算也更复杂
浮点数
最新推荐文章于 2022-06-07 13:31:54 发布