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#include 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\n",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#include 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("\n"); } 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\t frac=%d\t i=%d\t",exp,frac,i); return(sign<<31)|(exp<<23)|frac;}
测试0~10的结果为: