2017年浮点数408大题

【题目】

已知计算f(n)=的C语言函数f1如下:

int f1(unsigned n){
int sum=1,power;
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是否还会出现死循环?为什么?

【解析】由于i和n是unsigned型,因此“i<=n-1”是无符号数比较,n=0时,n-1的机器数为全1,值为2^32 -1,为unsigned型可表示的最大数,条件“i<=n-1”永真,因此出现死循环。若i和n改为int类型,则不会出现死循环。因为“i<=n-1”是有符号整数比较,n-1此时为-1,i<=n-1不成立就退出for循环。

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

PS:返回值是根据二进制串(机器数)的解释。

【解析】返回值相同。因为f(23)=2^(23+1) -1=2^24 -1,其二进制形式为24个1,即机器数为00FF FFFFH,int占32位所以没有溢出。float有1个符号位,8个指数位,23个底数位,并且隐含一位,所以23个底数位可以表示24位的底数。求f2(23)机器数:因为符号位为0,指数位为23+127=149的二进制为1001 0110,底数位为23个1即111 1111 1111 1111 1111 1111,所以f2(23)的机器数为0100 1011 0111 ...(20个1),十六进制表示为4B7F FFFFH。

3.f1(24)和f2(24)的返回值分别为33 554 431和33 553 432.0,为什么不相等?

【解析】当n=24时,f(24)=1 1111 1111 1111 1111 1111 1111 B,而float型数只有24位有效位,舍入后数值增大(答这个即可),所以f2(24)比f1(24)大。 下图所示:末尾的1舍去,末尾进1,然后前面的一坨1变为0,再一次右移,此时阶码+1。(0舍1入)

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

【解析】f(31)已超出了int型数据的表示范围,用f1(31)实现时得到的机器数为32个1,作为int型数解释时其值为-1,即f1(31)的返回值为-1。因为int型最大可表示的数是0后面加31个1,因此使f1(n)的返回值与f(n)相等的最大n值为30。

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

【解析】IEEE754用“阶码全1,尾数全0”表示无穷大。f2的返回值为float型,机器数7F80 0000H对应的值是正无穷。当n=126时,f(126)=2^127 -1=1.11...1×2^126,对应的阶码为126+127=253,尾数部分舍入后阶码加1,最终阶码为254,是IEEE754单精度格式表示的最大阶码。因此使f2结果不溢出的最大n值为126.(刚好能达到0舍1入后是结果不溢出的n最大情况)

【我的做法】由于IEEE754单精度阶码最大为254,所以254-1-127=136,即得。

当n=23时,f(23)为24位1,float型数有24位有效位,所以不需要舍入,结果精确,因此使f2获得精确结果的最大n值为23.

注:由第(5)问知道:浮点数可以表示更大范围,代价是损失精度;而整型可以表示更好精度,代价是损失范围。

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/106973174