第 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。你可以使用数据类型 int 和 unsigned,包括无符号和整数常数和运算。你不可以使用任何联合、结构和数组。更重要的是,你不能使用任何浮点数据类型、运算或者常数。取而代之,你的代码应该执行实现这些指定的浮点运算的位操作。
下面的函数说明了对这些规则的使用。对于参数 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 个值求值,将结果与你使用机器的浮点运算得到的结果相比较。