- 看了這篇文章才對浮點數的二進制表示有所了解,不過我的目的不是為了軟考。
- C/C++編譯器都是按照IEEE的浮點數表示法,即一種科學計數法 ,用符號,指數和尾數來表示,底數為2,也就是把浮點數表示為尾數乘以2的指數次方再添加上符號的形式。因為科學技術法 a×bm的形式,a介於1~10,而浮點數表示法中,a始終為1,所以在最終的表示結果中,這個1被略去。
具體規格是:
符號位 階碼 尾數 總長度 float 1 8 23 32 double 1 11 52 64 - 下面通過例子來解釋上面的表示規格:
- 38414.4表示為double:
- 分開整數和小數部分,整數化為16進制,0x960E;小數部分為:0.4=0.5×0+0.25×1+0.125×1+……+0.5×(1 or 0)/n+……。
有的小數可以窮盡,有的是永遠不會窮盡的,此時只需要提取出各項的系數,即011……,這些項的和加上整數部分共53位就可以了。正如上面所言的,最高為不變的1可以省略,最終是53-1=52位。
38414.4可以表示為b1001011000001110.0110011001100110011001100110011001100。
用科學計數法表示為1.0010110000011100110011001100110011001100110011001100×215。 - 然后計算階碼,階碼共11位,可以表示-1024~1023,因為指數可以為負數,為了方便表示,先加上1023變為非負數,上面的15表示為15+1023=103,二進制為10000001110。符號位,0為正,1為負。所以最終結果是
0 10000001110 0010110000011100110011001100110011001100110011001100
顏色與上表對應。
- 分開整數和小數部分,整數化為16進制,0x960E;小數部分為:0.4=0.5×0+0.25×1+0.125×1+……+0.5×(1 or 0)/n+……。
- 3490593表示為float:
3490593的浮點數為3490593.0。 - 整數化為二進制,為b1101010100001100100001,即1.101010100001100100001×221,由於float的尾數有23位,需要補0,即1.10101010000110010000100×221。
- 計算階碼時,類似double的表示,階碼共8位,表示的范圍是-128~127,為了方便,加上127,上面的21表示為21+127=148=b10010100。
最終結果是:
0 10010100 10101010000110010000100
顏色與上表對應。 - 0.5的二進制表示:
上面給出了0.4的二進制表示的計算方法:
0.4=0.5×0+0.25×1+0.125×1+……+0.5×(1 or 0)/n+……。
它是無窮盡的,知道精度合適了為止。然而對於有的數來說,是有窮的,比如
0.5=1×0.5。 - 整數部分為0,小數部分為0.1,所以0.5的二進制形式是0.1,即1.0 × 2-1。
- 計算階碼時,用127+(-1)=126=b1111110。
所以最終結果是:
0 01111110 00000000000000000000000
顏色與上表對應。 - -12.5的二進制浮點表示:
- 整數部分為12,即b1100;小數部分為0.5,即b0.1,即1100.10000000000000000000,即1.10010000000000000000000 × 23。
- 計算階碼,3+127=130,即b10000010,所以最終結果是:
1 10000010 10010000000000000000000
顏色與上表對應。 - 逆向求取,1011 1101 0100 0000 0000 0000 0000 0000轉為十進制:
- 1011 1101 0100 0000 0000 0000 0000 0000為:
1 01111010 10000000000000000000000
所以該數為-1.10000000000000000000000 × 201111010-127=-5=-b0.000011=0.046875 - 有關浮點數和double的精度(http://www.learncpp.com/cpp-tutorial/25-floating-point-numbers/):
Variables of type float typically have a precision of about 7 significant digits (which is why everything after that many digits in our answer above is junk). Variables of type double typically have a precision of about 16 significant digits. Variables of type double are named so because they offer approximately double the precision of a float.
以上內容均來自http://blog.163.com/yql_bl/blog/static/847851692008112013117685/。
