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.

【我的做法】由於IEEE754單精度階碼最大爲254,所以254-1-127=136,即得。

當n=23時,f(23)爲24位1,float型數有24位有效位,所以不需要舍入,結果精確,因此使f2獲得精確結果的最大n值爲23.

注:由第(5)問知道:浮點數可以表示更大範圍,代價是損失精度;而整型可以表示更好精度,代價是損失範圍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章