2017 组成原理 补码IEEE浮点数表示无穷大 解答题
第 43 题

已知f(n)=∑i=0n 2i=2n+1−1=11⋯1 B,计算f(n)的 C 语言函数 f1 如下:

int f1(unsigned n) {
    int sum=1, power=1;
    for(unsigned i=0; i<= n -1; i ++) {
        power * = 2;
        sum += power;
    }
    return sum ;
}

将 f1 中的 int 都改为 float,可得到计算 f(n) 的另一个函数 f2。假设 unsigned 和 int 型数据都占 32 位,float 采用 IEEE754 单精度标准。请回答下列问题。

(1) 当 n=0 时,f1 会出现死循环,为什么?若将 f1 中的变量 i 和 n 都定义为 int 型,则 f1 是否还会出现死循环?为什么?

(2) f1(23) 和 f2(23) 的返回值是否相等?机器数各是什么(用十六进制表示)?

(3) f1(24) 和 f2(24) 的返回值分别为 33554431 和 33554432.0,为什么不相等?

(4) f(31)=232−1,而 f1(31) 的返回值却为 -1,为什么?若使 f1(n) 的返回值与 f(n) 相等,则最大的 n 是多少?

(5) f2(127) 的机器数为 7F80 0000H,对应的值是什么?若使 f2(n) 的结果不溢出,则最大的 n 是多少?若使 f2(n) 的结果精确(无舍入),则最大的 n 是多少?

补码 IEEE浮点数表示

[tag_link]

1)由于i和n是 unsigned 型,故i≤n−l是无符号数比较,n=0时,n−1的机器数为全1,值是232−1,为 unsigned 型可表示的最大数,条件i≤n−1永真,因此出现死循环。(2 分)若i和n改为 int 类型则不会出现死循环。(1 分)因为i≤n−1是带符号整数比较,n=0时,n−1的值是−1,当i=0时条件i≤n−1不成立,此时退出 for 循环。(1 分)

2)f1(23) 与 f2(23) 的返回值相等。(1 分)f(23) =223+1−1=224−1,它的二进制形式是24个1。int 占32位,没有溢出。float 有1个符号位,8个指数位,23个底数位,23个底数位可以表示24位的底数。所以两者返回值相等。f1(23) 的机器数是 00FF FFFFH。(1 分)f2(23) 的机器数是 4B7F FFFFH。(1 分)显而易见前者是24个1,即00000000111111111111111111111111(2),后者符号位是0,指数位为23+12710 =100101102,底数位是111111111111111111111112。

3)当 n=24 时,f(24) = 1 1111 1111 1111 1111 1111 1111 B,而 float 型数只有 24 位有效位,舍入后数值增大,所以 f2(24) 比 f1(24) 大 1。(1 分)【评分说明】只要说明 f2(24) 需舍入处理即可给分。

4)显然 f(31) 已超出了 int 型数据的表示范围,用 f1(31) 实现时得到的机器数为 32 个 1,作为 int 型数解释时其值为 -1,即 f1(31) 的返回值为 -1。(1 分)因为 int 型最大可表示数是 0 后面加 31 个 1,故使 f1(n) 的返回值与 f(n) 相等的最大 n 值是 30。(1 分)【评分说明】对于第二问,只要给出 n=30 即可给分。

5)IEEE754 标准用“阶码全 1、尾数全 0”表示 无穷大。2 返回值为 f1oat 型,机器数 7F800000H 对应的值是+∞。(1 分)当 n=126 时,f(126) =2127−1=1.1…1×2126,对应阶码为 127+126=253,尾数部分舍入后阶码加 1,最终阶码为 254,是 IEEE754 单精度格式表示的最大阶码。故使 2 结果不溢出的最大 n 值为 126。(1 分)当 n=23 时,f(23) 为 24 位 1,f1oat 型数有 24 位有效位,所以不需舍入,结果精确。故使 f2 获得精确结果的最大 n 值为 23。(1 分)【评分说明】对于第二问,只要给出 n=23,即可给分。对于第三问,只要给出 n=126,即可给分。