什麼是浮點數
提到浮點數相信大家一定不會很陌生,浮點數表示對形如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位浮點數格式的示例: