float儲存方式

2021-09-24 22:54:01 字數 1255 閱讀 3468

@c語言

今天在程式中對uint32_t強制轉換float,結果發現是有損轉換,向大佬請教後得知是float儲存的比32bit的值小,所以通過詳細學習float儲存,彌補學習的短板。

學習的出處為:感謝

(-1)^s表示符號位,當s=0,v為正數;當s=1,v為負數

(2)m表示有效數字,大於等於1,小於2。

(3)2^e表示指數字。

舉例來說,十進位制的5.0,寫成二進位制是101.0,相當於1.01×2^2。那麼,按照上面v的格式,可以得出s=0,m=1.01,e=2。

ieee 754規定,對於32位的浮點數,最高的1位是符號位s,接著的8位是指數e,剩下的23位為有效數字m。

ieee 754對有效數字m和指數e,還有一些特別規定。

前面說過,1≤m<2,也就是說,m可以寫成1.******的形式,其中******表示小數部分。ieee754規定,在計算機內部儲存m時,預設這個數的第一位總是1,因此可以被捨去,只儲存後面的******部分。比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省1位有效數字。以32位浮點數為例,留給m只有23位,將第一位的1捨去以後,等於可以儲存24位有效數字。

至於指數e,情況就比較複雜。

首先,e為乙個無符號整數(unsignedint)。這意味著,如果e為8位,它的取值範圍為0255;如果e為11位,它的取值範圍為02047。但是,我們知道,科學計數法中的e是可以出現負數的,所以ieee754規定,e的真實值必須再減去乙個中間數,對於8位的e,這個中間數是127;對於11位的e,這個中間數是1023。

比如,2^10的e是10,所以儲存成32位浮點數時,必須儲存成10+127=137,即10001001。

然後,指數e還可以再分成三種情況:

(1)e不全為0或不全為1。這時,浮點數就採用上面的規則表示,即指數e的計算值減去127(或1023),得到真實值,再將有效數字m前加上第一位的1。

(2)e全為0。這時,浮點數的指數e等於1-127(或者1-1023),有效數字m不再加上第一位的1,而是還原為0.******的小數。這樣做是為了表示±0,以及接近於0的很小的數字。

(3)e全為1。這時,如果有效數字m全為0,表示±無窮大(正負取決於符號位s);如果有效數字m不全為0,表示這個數不是乙個數(nan)。

注意:十進位制小數入記憶體是極有可能失精度的比如 0.3 這哥們兒本身就無法轉化為有限二進位制表示

float 資料的儲存方式

3.以下兩條輸出語句分別輸出什麼?c 難 float a 1.0f cout int a endl cout int a endl cout boolalpha int a int a endl 輸出什麼?float b 0.0f cout int b endl cout int b endl co...

float和double儲存方式

在c c 中float是32位的,double是64位的,兩者在記憶體中的儲存方式和能夠表示的精度均不同,目前c c 編譯器標準都遵照ieee制定的浮點數表示法來進行float,double運算。無論是float還是double,在記憶體中的儲存主要分成三部分,分別是 1 符號位 sign 0代表正...

float型別的資料儲存方式

回顧預設轉換 byte 1b char 2b short 2b int 4b long 8b float 4b double 8b 問題 為什麼預設轉換時float型在long型後面?原因 1.他們的底層儲存結構不同 2.float型別的表示範圍比long型大 long 2 63 1 float 3...