淺談計算機內存中浮點數的表示

這裏寫圖片描述


什麼是浮點數

提到浮點數相信大家一定不會很陌生,浮點數表示對形如V=x*(z^y)的有理數進行編碼,它對執行涉及非常大的數字(|V|>>0)和非常接近於0的數字是非常有用的。

浮點數在內存中的存儲

廢話不多述,直接進入正題,首先,我們來看看下面這段代碼,大家可以自行在自己的編譯器上運行一下:

#include <stdio.h>


int main()
{
    float a = 0.0;
    float b = -0.0;
    int* pa = (int*)&a;
    int* pb = (int*)&b;
    printf("%f--->%d\n", a, *pa);
    printf("%f--->%d\n", b, *pb);
    return 0;
}

我們來看看運行結果吧:
這裏寫圖片描述

代碼中的意思是想看看浮點數0.0和-0.0轉化成整型存儲是什麼樣的,通過結果我們發現,浮點數在計算機內存中的存儲方式和整形應該是不一樣的。

那麼究竟是哪裏不一樣? 我們下面看一看。


IEEE754標準

在1985年,提出了IEEE標準,這是一個仔細制定的表示浮點數執行和運算的細節。

在IEEE標準中,浮點數用V=(-1)^s×M×2^E來表示;
它的各個參數分別代表如下意義:

  • s(符號位):s決定這個浮點數是正數還是負數;
    -* M(尾數,有效數字)*:M是一個二進制小數,它的範圍爲1~2或者0~1;
  • E(階碼,指數位):E的作用是對小數加權,這個權是2的E次冪;

    在計算機中浮點數是被這樣存儲的
    對於單精度浮點數(32bit)來說:
    這裏寫圖片描述
    對於雙精度浮點數來說:
    這裏寫圖片描述


根據E的值,又可以將被編碼的值分爲三種不同的情況:
這裏寫圖片描述

  • 規格化:對於規格化的來說,階碼E被解釋爲以偏置形式表是的有符號整數,它的值爲E=e-Bias(Bias爲偏置值,e爲無符號數(如圖所示)),其中Bias爲e的二進制位數,尾數M的值爲M=1+f(f描述的是小數字段的值);

  • 非規格化:當階碼域都爲0時,所表是的數爲非規格化的形式,在這種情況下E=1-Bias,尾數M的值爲f;

  • 特殊值:圖中的情況三和情況四爲特殊值的情況,它是當階碼域的位都爲1時所出現的情況,此時如果小數域爲0,那麼該浮點數表示的範圍無窮大,如果小數域不等於0,那麼此時浮點數將沒有意義;

關於這三種情況在數軸上的分佈,如下圖:
這裏寫圖片描述

下面給出一張表,展示一下8位浮點數格式的示例:
這裏寫圖片描述

發佈了89 篇原創文章 · 獲贊 190 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章