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 \t 机器运算:%d \t 函数运算:%d\n", f, j, k);
    }
}

运行结果:
1296452-20181016173214809-110297110.png

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("\t");
}

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("\n");
    }
}

运行结果:1296452-20181016173610628-288766501.png

转载于:https://www.cnblogs.com/yjtblog/p/9733547.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值