系统结构考点之浮点数格式化

  • Post author:
  • Post category:其他


算是学习系统结构后,遇到的第一个新的东西



如题2017年4月



分析

这个问题是发生在浮点数用二进数表示时的情形。此题做错,这其实源于对浮点数二进制表示问题的忽略。



相关知识



浮点数表示

这里直接引用书上的,虽然表示的复杂了些。但仔细看明白后,还要是比其他准确很多。

因为在看课本时已经复习了IEEE754中的内容,所以有些就不再展开了。

r

m

中的m可以认为是占用的二进制的位数。所以也可以说是二进制,八进制,十六进制这些比较 直观的概念来理解。

IEEE754中规定任何一个浮点数都可表示为:2

E

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/log

2

rm. 当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转成二进制
  1. 先将整数部分与小数部分分开,即分成2与0.51
  2. 先算整数部分,先看位数



    n

    =

    l

    o

    g

    2

    2

    =

    1

    ,

    +

    1

    =

    2

    n=log_2 2=1,不用上取整,所以+1=2位二进制数表示






    n




    =








    l


    o



    g










    2


















    2




    =








    1


    ,






























    +








    1




    =








    2



























    2/2 商1,余0

    1/2 商0,余1,所以整数部分,逆顺取表示为10

  3. 再算小数部分 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. 整数部分 1*2^(0) + 0*2^(1) + 1*2^(2) = 5
  2. 小数部分 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)



版权声明:本文为guangod原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。