20155216 第六周课上测试补交及教材练习完成
第六周课上测试-3-ch02
将程序正常运行结果如下:
将程序使用断点调试后运行结果为:
与运行结果的不同和联系:
运行结果输出的是v和uv的十进制结果,断点调试过程输出的是十六进制结果。
第六周课上测试-4-ch03
经过删除的代码如图:(压栈和出栈处在图中以标出)
教材P97 2.96
int float_f2i(float_bits f);
对于浮点数f,这个函数计算(int)f。如果f是NaN,你的函数应该向零舍入。如果f不能用整数表示(例如,超出表示范围,或者它是一个NaN),那么那么函数应该返回0x80000000。
测试你的函数,对参数f可以取的所有2^32个值求值,将结果与你使用的机器的浮点运算得到的结果相比较。
代码执行实现这些指定的浮点运算的位操作,用unsigned 类型模拟int去运算浮点数的转换,将一个float类型转换为整数,用unsigned实现一个float数转换为intt时的位级表示。
#include <stdio.h>
#include <limits.h>
typedef unsigned float_bits;
int float_f2i(float_bits f)
{
unsigned sign=f>>31;
unsigned exp = (f>>23)&0xff;
unsigned frac = f&0x7fffff;
if(exp == 0)
return 0;
if(exp == 0xff)
return 0x80000000;
unsigned m = frac+0x800000;
int e =exp-127;
if(e<0)
return 0;
else if(e>31)
return 0x80000000;
else if(e<23)
m>>(23-e);
else
m<<(e-23);
return sign<<31|m;
}
int main()
{
int i;
unsigned u;
float f;
for(u=INT_MIN;u<=INT_MAX;u++)
{
f=*((float*)&u);
i=float_f2i(u);
if((int)f == i)
printf("%u ok
",u);
else
{
printf("error");
return -1;
}
}
}
测试0~10的结果为:
教材P97 2.97
float_bits float_i2f(int i);
对于函数i,这个函数计算(float)i的位级表示。
测试你的函数,对参数f可以取的所有2^32个值求值,将结果与你使用的机器的浮点运算得到的结果相比较。
代码执行实现这些指定的浮点运算的位操作,用unsigned 类型模拟float去运算浮点数的转换,将一个int类型转换为浮点数,用unsigned实现一个int数转换为float时的位级表示。
#include <stdio.h>
#include <stdlib.h>
typedef unsigned float_bits;
float_bits float_i2f(int i);
int main()
{
int i;
for(i=INT_MIN;i<=INT_MAX;i++)
{
float_i2f(i);
printf("
");
}
return 0;
}
float_bits float_i2f(int i)
{
unsigned sign=0;
unsigned exp=0;
if(i<0)
{
i=-i;
sign=1;
}
unsigned frac=i;
i=i|(i>>1);
i=i|(i>>2);
i=i|(i>>4);
i=i|(i>>8);
i=i|(i>>16);
i=i^(i>>1);
frac=(frac-i);
while(i>>=1)
exp++;
frac=(frac<<(23-exp)) & 0xFFFFFFFF;
exp+=127;
sign=sign & 1;
exp=exp& 0xFF;
printf("exp=%d frac=%d i=%d ",exp,frac,i);
return(sign<<31)|(exp<<23)|frac;
}
测试0~10的结果为: