计算机浮点数编码实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浮点数编码实验

总体要求,只能使用局部变量,最多只能使用有限个运算符(等于号,括号不计),禁止定义或者使用任何宏和函数,禁止使用类型转换,禁止定义或者使用任何浮点常量,浮点编码原理阅读附录部分。

实验1:编写unsigned float_neg(unsigned uf)返回-uf的位级表示,最多使用10个操作符,

实现原理:只需将符号位取反,另外还要对非数进行处理,如果是非数,就直接返回。

实现代码:

unsigned float_neg(unsigned uf)

{

unsigned r=uf;

unsigned t;

//符号取反

r = r^0x80000000;

t = (uf>>23)&0xff;

//非数

if (t == 0xFF && (uf&0x7FFFFF)>0)

r = uf;

return r;

}

实验2:编写函数unsigned float_i2f(int x)函数,实现由int到float的类型转换,最多使用操作数量位30。

实现原理:

输入的数是个整型数,将整型数转换成浮点数表示,需要掌握浮点编码格式,以及浮点的精度表示问题。具体看实现代码的注释。实现代码:

unsigned float_i2f(int x)

{

unsigned s = 0;

unsigned r = 0;

unsigned e = 0, flag = 0, t;

int c = 0;

//0非规格化表示,直接返回0即可

if (x == 0)

return 0;

if (x < 0)

{

//转换成正整数

//并设置符号位

s = 0x80000000;

r = -x;

}

else r = x; //符号位为0

//确定尾数M,并记录左移的次数为计算阶码做准备while(!(r&0x80000000))

{

r = r<<1;

c = c+1;

}

//此处是进位处理此时r包含尾数的隐含位因此舍弃的正好

//是r的末尾8位,先得到末尾8位的值,如果大于0.5直接进//位,小于0.5直接舍弃,等于0.5时判断前面一位是0还是1,//来决定是否进位

t = r&0xFF;

if (t > 0x80)

flag = 1;

else if (t < 0x80)

flag = 0;

else if (t == 0x80)

if (r&0x100)

flag = 1;

else flag = 0;

//得到尾数,注意包含隐含位

r = r>>8;

//确定阶码为得到尾数将r左右成第31位为1,可以认为小数//点的位置在31位,输入的是整数,小数点在0的位置,而原来//小数点的位置就是31-c就是指数,

e = 31-c+127;

//进位

r = r+flag;

//考虑进位后是否会造成r最高位向左扩展

if(r&0x1000000)

{

r = r>>1;

e = e+1;

}

//舍掉隐含位

r = r&0x7fffff;

r = r|(e<<23)|s;

return r;

}

实验3:编写函数unsigned float_twice(unsigned uf),返回2倍uf的浮点型位级表示,最多可使用30个操作符,

实现原理:

要考虑浮点数的非规格化和规格化表示,首先要处理正负无穷的

情况,正负无穷要原封返回。此外就是当阶码为0时的情况,当解码为0时,尾数区没有隐含位,因此尾数要左移,实现乘2操作,但是如果尾数左移时要是超过尾数的区域,也就是左移一位,尾数的最高位超出23Bits时,这是要将浮点数转换成规格化表示。

当是规格话表示时,只需将阶码加1,就可以实现乘2操作。

实现代码:

unsigned float_twice(unsigned uf)

{

unsigned s = uf&0x80000000;

unsigned e = (uf>>23)&0xFF;

unsigned m = (uf&0x7fffff);

unsigned r;

if (e == 0xFF)

return uf;

if (e == 0)

{

if (m &0x400000)

{

e = e+1;

m = (m<<1)&0x7fffff;

}

else

m = m<<1;

}

else e = e+1;

r = s|(e<<23)|m;

return r;

}

附录浮点数编码

在计算机中浮点数采用V = (-1)s×M×2E的形式来表示,在计算机中单精度浮点数是32位,双精度浮点数是64位,我们仅仅对单精度浮点数做说明。就单精度浮点数而言,计算机中保存了S,M和E 的编码,其中S表示符号位,0表示正数,1表示负数;M是学名叫尾数;E是阶码,它是指数加上一个偏置数,单精度浮点数的偏置数是127,之所以加上这个偏置数是为了便于浮点数的运算。

在单精度浮点数中,符号位占最高位1位,阶码占用紧接着的8位,尾数占用最后23位,如下图所示:

31 30 22 0 重点说一下尾数M,M隐含了小数点前面的1,举个例子,如果M是1010000000000011110000B,那么M的实际值是1#1010000000000011110000B,其中#表示小数点的位置;然后说说阶码E,假定解码E是10001001B,十进制值位137,E需要再减去偏置

相关文档
最新文档