C 浮點數詳解

2021-09-23 07:47:46 字數 2485 閱讀 2669

ieee 754規定任意乙個二進位制浮點數v可以表示成下面的形式:

v =(

−1)s

×m×2

ev=(-1)^s × m × 2^e

v=(−1)

s×m×

2e例如下圖是32位單精度浮點數儲存模型

其中s表示符號位,當s=0,v為正數;當s=1,v為負數。

​m表示有效數字,1≤m<2(規約形式)

e表示指數字。

eg:十進位制的6.125,用拈加法寫成二進位制是110.001,等價於1.10001×22。可以得出s=0,m=1.10001,e=2

十進位制的-6.125,寫成二進位制是-110.001,等價於-1.10001×22。那麼,s=1,m=1.10001,e=2

由於m預設這個數的第一位總是1,因此可以被捨去,只儲存後面的小數部分。比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省1位有效數字。以32位浮點數為例,留給m只有23位,將第一位的1捨去以後,就可以儲存24位有效數字。

指數偏差

e為乙個無符號整數,如果是單精度浮點數,e為8位,它的取值範圍為0~255;如果是雙精度浮點數e為11位,它的取值範圍為0~2047。科學計數法中的e是可以出現負數的,所以ieee 754規定,存入記憶體時e的真實值必須再加上乙個中間數,對於8位的e,這個中間數是127(01111111);對於11位的e,這個中間數是1023。 比如,210的e是10,所以儲存成32位浮點數時,必須儲存成10+127=137,即10001001,127在這裡叫做指數偏移值

這種移碼表示的指數部分,中文稱作階碼

規約形式的浮點數

如果浮點數中指數部分的編碼值0

2e−2

002e−2

其中的e為儲存指數的位元的長度,(e不全為0或1)

比如,單精度(32-bit)的規約形式浮點數在指數偏移值的值域為[00000001,11111110],m的範圍是[000…000,111…111]=>23-bit

eg:0.5(1/2)的二進位制形式為0.1,由於規定正數部分必須為1,即將小數點右移1位,則為1.0×2(-1),其階碼為-1+127=126,表示為01111110,而尾數1.0去掉整數部分為0,補齊0到23位00000000000000000000000,則其二進位制表示形式為:

0 01111110 00000000000000000000000
非規約形式的浮點數e全為0,m非零,這時,浮點數的指數e等於-126(或者-1022)即為真實值,需要注意的是這裡並不是-127(這樣是為了保證中間資料近似連續),有效數字m不再加上第一位的1,而是還原為 0.******的小數。(規約浮點數的尾數大於等於1且小於2,而非規約浮點數的尾數小於1且大於0)這樣做是為了表示±0,以及接近於0的很小的數字。

無窮

e全為1,m全為0,表示±無窮大(正負取決於符號位s)

nan

e全為1,m不全為0,表示這個數不是乙個數(nan)

(64 位的雙精度浮點數最高的 1 位是符號位 s,接著的 11 位是指數 e,剩下的52位為有效數字m)

下面是一道面試題:

第一部分:

int型別的9在記憶體中是這樣儲存的(32位環境)

0000 0000 0000 0000 1001

將它的位址強轉成float型別後:

其符號位s=0;

8位的指數e=0000 0000

由於指數為全是0,它屬於非規約形式的浮點數,尾數小於1且大於0,所以,m=0.00000000000000000001001(小數點後有23位)

因此,浮點數v就寫成:

v=(-1)0× 0.00000000000000000001001×2(-126)=1.001×2(-146)

它表示乙個接近於0的很小的數字,十進位制表示就是0.000000

第二部分:

float型別的9.0在記憶體中是這樣儲存的(32位環境)

9.0=>1001.0=>1.001×23=> s=0, m=1.001,e=3+127=130

0 10000010 001 0000 0000 0000 0000 0000

強轉成十進位制,就是109156761

c語言整數轉浮點數 浮點數的秘密

我們在學習 c 語言時,通常認為浮點數和小數是等價的,並沒有嚴格區分它們的概念,這也並沒有影響到我們的學習,原因就是浮點數和小數是繫結在一起的,只有小數才使用浮點格式來儲存。其實,整數和小數可以都使用定點格式來儲存,也可以都使用浮點格式來儲存,但實際情況卻是,c 語言使用定點格式儲存整數,使用浮點格...

C51浮點數顯示 浮點數表示方法

c51中的浮點數儲存方式 n年前曾在c51bbs論壇中發布過 float 浮點形,它是符合ieee 754標準的單精度浮點形資料,在十進位制中具有7位有效數字。float型據占用四個位元組 32位二進位制數 在記憶體中的存放格式如下 位元組位址 由低到高 0 1 2 3 浮點數內容 mmmmmmmm...

浮點數 儲存

關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...