(13分)已知\[ f(n)=\sum_{i = 0}^{n}2^{i}=2^{n + 1}-1=\underbrace{11\cdots1}_{n + 1位}\text{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是否还会出现死循环?为什么?(4分)
(2) f1(23)和f2(23)的返回值是否相等?机器数各是什么(用十六进制表示)?(3分)
(3) f1(24)和f2(24)的返回值分别为33554431和33554432.0,为什么不相等?(1分)
(4) f(31)= 2^32−1 ,而f1(31)的返回值却为-1,为什么?若使f1(n)的返回值与f(n)相等,则最大的n是多少?(2分)
(5) f2(127)的机器数为7F80 0000H,对应的值是什么?若使f2(n)的结果不溢出,则最大的n是多少?若使f2(n)的结果精确(无舍入),则最大的n是多少?(3分)
登录后提交答案