浮点数格式化问题
算是学习系统结构后,遇到的第一个新的东西
如题2017年4月
![](https://i-blog.csdnimg.cn/blog_migrate/728216c77a12ab2daece7b2b193df175.jpeg#pic_center)
分析
这个问题是发生在浮点数用二进数表示时的情形。此题做错,这其实源于对浮点数二进制表示问题的忽略。
相关知识
浮点数表示
这里直接引用书上的,虽然表示的复杂了些。但仔细看明白后,还要是比其他准确很多。
![](https://i-blog.csdnimg.cn/blog_migrate/e0f3f185c0febbe9a0c9360bc891ca63.jpeg#pic_center)
因为在看课本时已经复习了IEEE754中的内容,所以有些就不再展开了。
rm中的m可以认为是占用的二进制的位数。所以也可以说是二进制,八进制,十六进制这些比较 直观的概念来理解。
IEEE754中规定任何一个浮点数都可表示为:2E X M的形式,在计算机的存储中也只是存储了阶码E与尾数M。
阶码E,把它理解成指数就好多了,这样可以快速分辨出最大正数与最大负数,在计算机中用二进位表示,分别是:
最大正数=最大正尾数 X 2最大阶码
最大负数=最大负尾数 X 2最小阶码,相当于越靠近0
浮点数的格式化
主要是为了提高表示精度,当浮点数的尾数的真值不为0时,满足 1/2<M<1.形式为:
对于正数而言,有M = 00.1φφ…φ;//前两个0为符号,第二个1格式化正尾数,问题的答案
对于负数,其补码形式为11.0φφ…φ(即-0.0*******,左归)。
当进行补码浮点加减运算时,只要对运算结果的符号位和小数点后的第一位进行比较:如果它们不等,00.1φφ…φ或11.1φφ…φ,就是规格化的数;如果相等,就不是格式化的数,需要尾数左移实现格式化。
就不是格式化的数,需要尾数左移实现格式化。
在浮点加减运算时,尾数求和的结果也可以得到01.φφ…φ或10.φφ…φ,即两符号位不相等,在这定点加减运算中称为溢出,是不允许的。
格式化正尾数
书上的定义为:正尾数小数点后的第1个rm进制数位不是0的数。这个好理解,正数的小数点后,越靠近小数点,数越小,所以最小的正尾数值应当为小数点后第1个rm进制数位为1,其余位为0,所以是1 X rm^(-1)
rm中的m:表示尾数有多少位。在rm进制下,所占的总的计算机位数。
用m’表示:在rm进制下,所占的位数。公式为m’=m/log2rm. 当rm=2,也就是二进制时m=m’.当rm=16,也就是十六进制的时候,m’=m/4.
同理,最大正尾数就是尾数各数位均为rm-1,如二进制就是2-1,16进制就是15,映像到二进制就是各位都是1.所谓的最大正尾数,就是如果最后一位上加上1,尾数就不存在了,而是直接进位变成了1,这就是最大的正尾数,所以用1(最大正尾数左边界)- rm(-m’)(最小位的权值),表示的就是最大正尾数。
小数点后的位权与十进制是一样的,小数点后1位表示的是10^(-1)
小数的十进制与二进制转化
十进制小数转成二进制小数
十进制数的整数位是二进制数的整数位(按 除以2取余,逆序排列),十进制数的小数位是二进制数的小数位(按乘 2 取整,顺序排列)
例子,将2.51转成二进制
- 先将整数部分与小数部分分开,即分成2与0.51
- 先算整数部分,先看位数
n
=
l
o
g
2
2
=
1
,
不
用
上
取
整
,
所
以
+
1
=
2
位
二
进
制
数
表
示
n=log_2 2=1,不用上取整,所以+1=2位二进制数表示
n=log22=1,不用上取整,所以+1=2位二进制数表示
2/2 商1,余0
1/2 商0,余1,所以整数部分,逆顺取表示为10 - 再算小数部分 0.51
0.51 X 2 = 1.02 取1
0.02 X 2 = 0.04 取0
0.04 X 2 = 0.08 取0
0.08 X 2 = 0.16 取0
0.16 X 2 = 0.32 取0
0.32 X 2 = 0.64 取0
0.64 X 2 = 1.28 取1 顺序取就是0.1000001
… 后面还有很多省略后直到余数为0,余数不为0也没有关系,取一定的精度即可,合起来就是10.1000001
二进制小数转成十进制
正数部分,从左到右以,2 ^ 0开始。小数部分从左到右,2^(-1)开始,权值相加
例子,101.011转成十进制
- 整数部分 1*2^(0) + 0*2^(1) + 1*2^(2) = 5
- 小数部分 0*2^(-1) + 1*2^(-2) + 1*2^(-3) = 1/4+1/8 = 0.875
二进制小数的科学计数
指数部分也用二进制表示即可。
101.011=1.01011 X 2 ^ (10)
可以看到,小数点右移了两位,所以2 ^ 2转化成二进制就是2 ^ (10)