電腦浮點數 float 表示

來源:互聯網
上載者:User

這篇文章講得比較淺顯易懂,所以轉一下。 必須對電腦原理的原碼、反碼、補碼、移碼有個清晰的認識,另外參考一下ieee754,否則也會有不明白的地方。括弧內為本人看法或觀點。 我想浮點數的實現與編譯器也會有很大關係的。

 

(轉)前兩天仔細看了看, 覺得研究電腦如果不說說如何表示浮點數就太不厚道了.很多人也寫過, 這裡自己再寫一道, 一是為了加深點印象, 第二是希望自己能寫的深入淺出一點, 希望看過的人都能很容易看懂.

先說說32 位的 float型.
一個浮點數 X, 在電腦中表示為:
         X = a  *  2e  
  這裡 e 代表指數,  a 代表尾數,   在 電腦內部, 他們都是用二進位表示的. 其中 a 用二進位的科學標記法表示, 由於科學標記法第一位總是1 (0除外) , 所以第一位略去不計.  e 表示的時候, 因為要表示出負數, 所以 要加上127 ,  實際運算的時候要減去 127.

IEEE 規定, 32 位 float型被拆開成以下格式, 左邊為高位 :
           0                                 0000 0000                     0000000 00000000 00000000
        最高位,第32位            第 31-24位,共8位                第23-1位            
        符號位                            指數位                                   尾數位
      0為正,1為負               -127~+128                        0~0x 7f ff ff

float 的範圍是 -3.40282 * e38 ~ + 3.40282 * e38

一般在人看來是 十進位的數, 要轉換成二進位. 十進位轉二進位, 大於1 的部分就是除以2 取餘, 小於1 的部分乘2 取整(上電腦原理課,講了那麼多東西就記得這句話了)
 比如 8.5  轉換成二進位就是 1000.1 , 處理成這一步, 還要用科學標記法表示, 就成了 1.0001 * 23 ,  注意: 由於1.0001 第一個1 要去掉(科學計數法), 所以成了 0001 , 3 需要加上 127 就成了 130 (移碼運算,原碼加上2^n的結果再減1,其中n是資料位元長度), 二進位就是 10000010 套用上面話就表示為:
     0  10000010 0001000  00000000 00000000
     16進位就是: 0x 41 08 00 00 , 一般來說 , intel 系列的CPU 位元組順序是Little-Endian(高位元組放在後面), 因此在記憶體中的存放順序是: 0x 00 00 08 41 , 這樣就完成了一次浮點數的表示.

注意: 浮點數 0.0  在電腦中表示為 0x 00 00 00 00 .

那麼浮點數的精度是怎麼回事情呢? 當我們使用二進位表示 大於1 的部分的時候, 沒有問題, 除以2,一直下去, 最後一位肯定不是1 就是 0; 那麼小數部分呢?  舉個例子, 比如 0.8
表示    0.8
             * 2
            1.6 - 1 = 0.6          
                             * 2
                             1.2 -1 = 0.2  - 0
                                            .* 2
                                             0.4 - 0
                                              *2     
                                             0.8 - 0
這樣就迴圈了 就是說 0.8 的二進位 就是  0.11000 11000 ......  一直迴圈下去, 而我們電腦如果表示0.8隻能取0後面的前25位(第一個1 略去, ^_^), 這就說明 如果是  0.80000000000000000000000001 , 它表示出來的值其實是和 0.8 一樣, 所以我們比較float型的數字 用 a == b 其實是沒有根據的, 一般都是 用 abs(a - b) < 0.000001 (0.000001應該是二進位吧?此處涉及到數學的實數常識,公式|a-b|<c  轉換成  -c<a-b<c)之類就預設是相等.  所以這就出現了經典的精度問題.

那麼 double型呢? 咱們可以照 float 型的葫蘆 來畫了.
double 型 只是說 取 64 位元, 比float型的位 多一倍, 但是同樣 逃不出精度的五指山. 
IEEE 規定 double 型 ,
    第64位             63-53                                                52-1
   符號位            指數位 ( -1023~+1024)                     尾數位

所以 double型的範圍是  -1.79769 * e308 ~ +1.79769 * e308
多用了幾位, 表示範圍大了很多, 其實本質跟float型一樣.

看來電腦是用來計算的, 一點都不假, 所謂機器智能, 也是人加上去的,  這就更不用懷疑了.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.