天天看點

浮點數的二進制表示(IEEE 754标準)

浮點數是我們在程式裡常用的資料類型,它在記憶體中到底是怎麼樣的形式存在,是我了解之前是覺得好神奇,以此記錄,作為學習筆記。

現代計算機中,一般都以IEEE 754标準存儲浮點數,這個标準的在記憶體中存儲的形式為:

浮點數的二進制表示(IEEE 754标準)

對于不同長度的浮點數,階碼與小數位配置設定的數量不一樣,如下:

浮點數的二進制表示(IEEE 754标準)

對于32位的單精度浮點數,數符配置設定是1位,階碼配置設定了8位,尾數配置設定了是23位。

根據這個标準,我們來嘗試把一個十進制的浮點數轉換為IEEE754标準表示。

例如:178.125

  1. 先把浮點數分别把整數部分和小數部分轉換成2進制
    1. 整數部分用除2取餘的方法,求得:10110010
    2. 小數部分用乘2取整的方法,求得:001
    3. 合起來即是:10110010.001
    4. 轉換成二進制的浮點數,即把小數點移動到整數位隻有1,即為:1.0110010001 * 2^111,111是二進制,由于左移了7位,是以是111,階數即為111。
  2. 把浮點數轉換二進制後,這裡基本已經可以得出對應3部分的值了
    1. 數符:由于浮點數是正數,故為0.(負數為1)
    2. 階碼 : 階碼的計算公式:階數 + 偏移量。階碼是需要作移碼運算,在轉換出來的二進制數裡,階數是111(十進制為7),對于單精度的浮點數,偏移值為01111111(127)[偏移量的計算是:2^(e-1)-1, e為階碼的位數,即為8,是以偏移值是127],即:111+01111111 = 10000110
    3. 尾數:小數點後面的數,即0110010001
    4. 最終根據位置填到對位的位置上:
    5. 浮點數的二進制表示(IEEE 754标準)

可能有個疑問:小數點前面的1去哪裡了?由于尾數部分是規格化表示的,最高位總是“1”,是以這是直接隐藏掉,同時也節省了1個位出來存儲小數,提高精度