第 2 章家庭作业:2.92~2.97

第 2 章家庭作业:2.92~2.97

位级浮点编码规则

在接下来的题目中,你所写的代码要实现浮点函数在浮点数的位级表示上直接运算。你的代码应该完全遵循 IEEE 浮点运算的规则,包括当需要舍入时,要使用向偶数舍入的方式。

为此,我们把数据类型 float_bits 等价于 unsigned

/* Access bit-level representation floating-point number */
typedef unsigned float_bits;

你的代码中不使用数据类型 float,而要使用 float_bits。你可以使用数据类型 intunsigned,包括无符号和整数常数和运算。你不可以使用任何联合、结构和数组。更重要的是,你不能使用任何浮点数据类型、运算或者常数。取而代之,你的代码应该执行实现这些指定的浮点运算的位操作。

下面的函数说明了对这些规则的使用。对于参数 f,如果 f 是非规格化的,该函数返回 ±0(保持 f 的符号),否则,返回 f

/* If f is denorm, return 0. Otherwise, return f */
float_bits float_denorm_zero(float_bits f) {
    /* Decompose bit representation into parts */
    unsigned sign = f >> 31;
    unsigned exp = f >> 23 & 0xFF;
    unsigned frac = f & 0x7FFFFF;
    if (exp == 0) {
        /* Denormalized. Set fraction to 0 */
        frac = 0;
    }
    /* Reassemble bits */
    return (sign << 31) | (exp << 23) | frac;
}

家庭作业 2.92(★★)遵循位级浮点编码规则,实现具有如下原型的函数:

/* Compute -f. If f is NaN, then return f. */
float_bits float_negate(float_bits f);

对于浮点数 f,这个函数计算 -f。如果 f 是 NaN,你的函数应该简单地返回 f

测试你的函数,对参数 f 可以取的所有 232 个值求值,将结果与你使用机器的浮点运算得到的结果相比较。

家庭作业 2.93(★★)遵循位级浮点编码规则,实现具有如下原型的函数:

/* Compute |f|. If f is NaN, then return f. */
float_bits float_absval(float_bits f);

对于浮点数 f,这个函数计算 |f|。如果 f 是 NaN,你的函数应该简单地返回 f

测试你的函数,对参数 f 可以取的所有 232 个值求值,将结果与你使用机器的浮点运算得到的结果相比较。

家庭作业 2.94(★★★)遵循位级浮点编码规则,实现具有如下原型的函数:

/* Compute 2*f. If f is NaN, then return f. */
float_bits float_twice(float_bits f);

对于浮点数 f,这个函数计算 2.0*f。如果 f 是 NaN,你的函数应该简单地返回 f

测试你的函数,对参数 f 可以取的所有 232 个值求值,将结果与你使用机器的浮点运算得到的结果相比较。

家庭作业 2.95(★★★)遵循位级浮点编码规则,实现具有如下原型的函数:

/* Compute 0.5*f. If f is NaN, then return f. */
float_bits float_half(float_bits f);

对于浮点数 f,这个函数计算 0.5*f。如果 f 是 NaN,你的函数应该简单地返回 f

测试你的函数,对参数 f 可以取的所有 232 个值求值,将结果与你使用机器的浮点运算得到的结果相比较。

家庭作业 2.96(★★★★)遵循位级浮点编码规则,实现具有如下原型的函数:

/*
 * Compute (int) f.
 * If conversion causes overflow or f is NaN, return 0x80000000
 */
int float_f2i(float_bits f);

对于浮点数 f,这个函数计算 (int) f。如果 f 是 NaN,你的函数应该向零舍入。如果 f 不能用整数表示(例如,超出表示范围,或者它是一个 NaN),那么函数应该返回 0x80000000

测试你的函数,对参数 f 可以取的所有 232 个值求值,将结果与你使用机器的浮点运算得到的结果相比较。

家庭作业 2.97(★★★★)遵循位级浮点编码规则,实现具有如下原型的函数:

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

对于参数 i,这个函数计算 (float) i 的位级表示。

测试你的函数,对参数 i 可以取的所有 232 个值求值,将结果与你使用机器的浮点运算得到的结果相比较。