浮點數的二進制表示


  • 看了這篇文章才對浮點數的二進制表示有所了解,不過我的目的不是為了軟考。
  • 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
        顏色與上表對應。
    • 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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM