• ch02 课下作业


    2.96遵循位级浮点编码规则,实现具有如下原型的函数:

    /*
      *Compute (int) f.
      *If conversion causes overflow or f is NaN, return
      */
    int float_f2i(float bits f);
    

    对于浮点数f,这个函数计算(int)f。如果f是NaN,你的函数应该向零舍人。如果f不能用整数表示(例如,超出表示范围,或者它是一个NaN),那么函数应该返回。x800000000测试你的函数,对参数f可以取的所有2^32个值求值,将结果与你使用机器的浮点运算得到的结果相比较。

    代码:

    #include <stdio.h>
    
    typedef unsigned float_bits;
    
    int float_f2i(float_bits f){
        unsigned sign, exp, frac, last_bit;
        int i;
        sign = f >> 31;
        exp = (f >> 23) & 0xff;
        frac = f & 0x7fffff;
        if (exp == 158 && frac == 0 && sign == 1)
            i = 0x80000000;
        else if (exp > 157 || exp == 0xff)
            i = 0x80000000;
        else if (exp < 126)
            i = 0;
        else{
            exp -= 127;
            frac |= 0x800000;
            if (exp > 23){
                exp -= 23;
                frac <<= exp;
            }else if (exp < 23){
                exp = 23 - exp;
                frac >>= exp;
            }
            if (sign == 1)
                i = (~frac) + 1;
            else
                i = frac;
        }
        return i;
    }
    void main(){
        float f;
        unsigned i;
        int j, k;
        
        for (i = 0x3fbfff70U; i <= 0xffffffffU; i++)
        {
            f = *(float *)&i;
            j = (int)f;
            k = float_f2i(i);
            printf("原值:%f 	 机器运算:%d 	 函数运算:%d
    ", f, j, k);
        }
    }
    

    运行结果:

    2.97
    遵循位级浮点编码规则,实现具有如下原型的函数:

    /*Compute (float) i*/
    float bits float_i2f(int i);
    

    对于函数i,这个函数计算(float) i的位级表示。
    测试你的函数,对参数f可以取的所有2^32个值求值,将结果与你使用机器的浮点运算得到的
    结果相比较。
    代码:

    #include <stdio.h>
    
    typedef unsigned float_bits;
    typedef unsigned char *byte_pointer;
    
    void show_bytes(byte_pointer start, size_t len) {
        size_t i;
        for(i=0; i<len; i++)
            printf(" %.2x", start[i]);
        printf("	");
    }
    
    float_bits float_i2f(int x) {
        unsigned shiftLeft=0;  
        unsigned afterShift, tmp, flag;  
        unsigned absX=x;  
        unsigned sign=0;  
        if (x==0) 
            return 0;  
        if (x<0){  
            sign=0x80000000;  
            absX=-x;  
        }  
        afterShift=absX;  
        while (1){
            tmp=afterShift;
            afterShift<<=1;
            shiftLeft++;  
            if (tmp & 0x80000000) 
                break;  
        }
        if ((afterShift & 0x01ff)>0x0100)  
            flag=1;  
        else if ((afterShift & 0x03ff)==0x0300)  
            flag=1;  
        else  
            flag=0;  
        return sign+(afterShift>>9)+((159-shiftLeft)<<23)+flag;
    }
    
    
    void main(){
        int x;
        unsigned i,k;
        float j;
    
        for (i = 0x3fbfff70U; i <= 0xffffffffU; i++){
            x = *(int *)&i;
            printf("原值:");
            show_bytes((byte_pointer) &x, sizeof(int));
            j=(float)i;
            printf("机器运算:");
            show_bytes((byte_pointer) &j, sizeof(float));
            k=float_i2f(i);
            printf("函数运算:");
            show_bytes((byte_pointer) &k, sizeof(unsigned));
            printf("
    ");
        }
    }
    

    运行结果:

  • 相关阅读:
    批量管理服务器,批量分发文件
    IIS最大连接数优化
    在CentOS 7中安装与配置JDK8
    可扩展流程设计工具方案
    An internal erroroccurred during: "Removing compiler problem markers...".java.lang.String
    .NET和java之争实没必要
    提高生产率的VS插件
    Java Synchronized关键字
    Flex拖动实现方法
    WF3.0和4.0区别介绍
  • 原文地址:https://www.cnblogs.com/yjtblog/p/9733547.html
Copyright © 2020-2023  润新知