计算机浮点数编码实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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需要再减去偏置