虽然f1和f2都是计算的是&nbs...
虽然f1和f2都是计算的是 f(n)=2^(n+1)−1 ,但是由于输入和输出数据类型的限制,实际输出结果可能有出入。
(1) 由于i和n是unsigned型,因此“i <= n-1”是无符号数比较。n=0时,n-1的机器数为全1,值是 2^32−1 ,为unisgned型可表示的最大数,条件“i <= n-1”恒为真,因此出现死循环。
若将i和n改为int类型,则不会出现死循环。因为“i <= n-1”是有符号数比较。n=0时,n-1的值是-1,当i = 0时条件“i <= n-1”为假,此时退出for循环。
(2) f1(23)与f2(23)的返回值相等。 。f1(23)为int类型,int占32位,没有溢出。f2(23)为float类型,float采用IEEE754单精度标准,float有1个符号位,8个指数位,23个尾数位,考虑小数点前面省略的1,float有24个有效数值位。阶码为 23+127=150=10010110B。所以两者返回值相等。
f1(23)为int类型,机器数是0000 0000 1111 1111 1111 1111 1111 1111B = 00FFFFFFH。
f2(23)为float类型,float采用IEEE754单精度标准,机器数是 =4B7FFFFFH。
(3) 当n=24时, 。f1(23)为int类型,int占32位,没有溢出。f2(23)为float类型,float采用IEEE754单精度标准,float有1个符号位,8个指数位,23个尾数位,考虑小数点前面省略的1,float有24个有效数值位。不满足25个有效数值位的要求,这里需要进行舍入,按0舍1入,f2(24)= 2^25 =33554432.0,比f1(24)= 2^25−1 =33554431大,即f1(24)和f2(24)返回值不相等。
(4) f(31)= 2^32−1 ,int表示范围为 −2^31∼2^31−1 ,溢出,f1(31)的二进制形式是32个1,C语言整型用补码表示,得到f1(31)的返回值为-1。因为 位f(n)= 且int型最大可表示数是符号位为0后面31个数值位全为1,即n+1=31,解得n=30,所以使f1(n)的返回值与f(n)相等的最大n值是30。
(5) 7F80 0000H= ,阶码位全1,尾数位全0,表示无穷大,符号位为0,表示正无穷大,即 +∞ 。
当n=127时, 。表示为浮点数 ,括号内为需要舍入的部分,按0舍1入进行舍入后需要右规,阶码加1,得到 ,该浮点数表示 +∞ ,溢出。
当n=126时, 。表示为浮点数 ,括号内为需要舍入的部分,按0舍1入进行舍入后需要右规,阶码加1,得到 ,阶码11111110B达到IEEE754单精度格式表示的最大阶码。
综上,若使f2(n)的结果不溢出,则最大的n是126。
当 n = 24 时根据(1)的结果,f2(24)需要舍入。
当 n = 23 时, 。f2(23)为float类型,float采用IEEE754单精度标准,float有1个符号位,8个指数位,23个尾数位,考虑小数点前面省略的1,float有24个有效数值位。所以不需舍入,结果精确。
综上,若使f2(n)的结果精确(无舍入),则最大的n是23。
登录后提交答案