浮點數儲存規則
根據國際標準ieee(電氣和電子工程協會)規定,任何乙個浮點數num的二進位制數可以寫為:
num = (-1)^s*m*2^e;//(s表示符號,e表示階乘,m表示有效數字)
①當s為0時,表示乙個正數;當s為1時,表示乙個負數
②m表示有效數字,1<= m <2
③2^e表示指數
比如十進位制的3.0,二進位制就是0011.0 就可以寫成(-1)^0*1.1*2^1
在比如十進位制的-3.0,二進位制就是-0011.0 就可以寫成(-1)^1*1.1*2^1
而規定float型別有乙個符號位(s),有8個指數字(e),和23個有效數字位(m)
double型別有乙個符號位(s),有11個指數字(e),和52個有效數字位(m)
以float型別為例:
ieee對於(有效數字)m和(指數)e有特殊的規定: (以float為例)
1.因為m的值一定是1<= m <2,所以它絕對可以寫成1.******x的形式,所以規定m在儲存時捨去第乙個1,只儲存小數點之後的數字。這樣做節省了空間,以float型別為例,就可以儲存23位小數資訊,加上捨去的1就可以用23位來表示24個有效的資訊。
2.對於e(指數)e是乙個無符號整數所以e的取值範圍為(0~255),但是在計數中指數是可以為負的,所以規定在存入e時,在它原本的值上加上中間數(127),在使用時減去中間數(127),這樣e的真正取值範圍就成了(-127~128)。
對於e還分為三種情況:
①e不全為0,不全為1:
這時就用正常的計算規則,e的真實值就是e的字面值減去127(中間值),m的值要加上最前面的省去的1。
②e全為0
這時指數e等於1-127為真實值,m不在加上捨去的1,而是還原為0.******xx小數。這樣為了表示0,和一些很小的整數。
所以在進行浮點數與0的比較時,要注意。
③e全為1
當m全為0時,表示±無窮大(取決於符號位);當m不全為1時,表示這數不是乙個數(nan)
下面是測試**:
void test(void)
**輸出結果:
具體的計算過程如下:
浮點數在記憶體中的儲存
浮點數在記憶體中的儲存方式與整型數字是不同的,對浮點數的儲存實際上是對ieee754中規定的s m e的儲存。浮點數 float double long double 根據國際標準ieee754,任意乙個二進位制浮點數可以被表示成下面的形式 ieee754規定 對於32位的浮點數,最高的1個位元位為...
浮點數在記憶體中的儲存
浮點數在記憶體中的儲存 常見浮點數型別 float,double,long double.那麼浮點數在記憶體中又是如何儲存的呢,它會和整數一樣嗎?那它的小數點又是如何儲存的呢 int main 執行結果為 n和 pfloat在記憶體中明明是同一位置同一數字,為什麼浮點數和整數的讀取結果會不一樣.說明...
浮點數在記憶體中的儲存
整數在計算機記憶體儲存以二進位制儲存很容易理解,那浮點數怎麼儲存的呢?其實之所以想到要一 竟是因為類似下面這段 include intmain void 由於大意,用轉義字元 d來列印浮點數,結果顯示 為什麼是 461808600呢?我也很奇怪,然後就開始研究研究吧。當然這個也和編譯器有關,有些就會...