zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
    }
    

    运行结果:

  • 相关阅读:
    java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor错误
    http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html
    异或巧用:Single Number
    Highcharts:X轴分组堆叠图
    Vs2012在Linux开发中的应用(5):项目属性的定义
    BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度
    Python 点滴 I
    easyUI 验证控件应用、自己定义、扩展验证 手机号码或电话话码格式
    InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts
    Java设计模式-设计模式的六种原则
  • 原文地址:https://www.cnblogs.com/yjtblog/p/9733547.html
Copyright © 2011-2022 走看看