20155216 第六周课上测试补交及教材练习完成

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\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 <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("\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的结果为:

posted @ 2017-10-29 10:55  Lee.X  阅读(575)  评论(0编辑  收藏  举报