C語言浮點數存儲方式


對於浮點類型的數據采用單精度類型(float)和雙精度類型(double)來存儲,float數據占用 32bit,double數據占用 64bit.其實不論是float類型還是double類型,在計算機內存中的存儲方式都是遵從IEEE的規范的,float 遵從的是IEEE R32.24 ,而double 遵從的是R64.53。   

無論是單精度還是雙精度,在內存存儲中都分為3個部分:  

1) 符號位(Sign):0代表正,1代表為負;  

2) 指數位(Exponent):用於存儲科學計數法中的指數數據,並且采用移位存儲; 

3) 尾數部分(Mantissa):尾數部分

 

其中float的存儲方式如下圖所示:


而雙精度的存儲方式為:

R32.24和R64.53的存儲方式都是用科學計數法來存儲數據的

用二進制的科學計數法第一位都是1嘛,干嘛還要表示呀?可以將小數點前面的1省略,所以23bit的尾數部分,可以表示的精度卻變成了 24bit,道理就是在這里。

那24bit能精確到小數點后幾位呢,我們知道9的二進制表示為1001,所以4bit能精確十進制中的1位小數 點,24bit就能使float能精確到小數點后6位,而對於指數部分,因為指數可正可負,8位的指數位能表示的指數范圍就應該為:-127-128了, 所以指數部分的存儲采用移位存儲,存儲的數據為元數據+127。

下面就看看8.25和120.5在內存中真正的存儲方式: 

首先看下8.25,用二進制的科學計數法表示為
:1.0001*2^3  按照上面的存儲方式,符號位為0,表示為正;指數位為3+127=130,位數部分為 1.00001,故8.25的存儲方式如下:  0xbffff380:    01000001000001000000000000000000 

分解如下:0--10000010--00001000000000000000000  

符號位為0,指數部分為10000010,位數部分為 00001000000000000000000 

 

同理,120.5在內存中的存儲格式如下:  0xbffff384:    01000010111100010000000000000000 

分解如下:0--10000101--11100010000000000000000  

 

那么如果給出內存中一段數據,並且告訴你是單精度存儲的話,你如何知道該數據的十進制數值 呢?其實就是對上面的反推過程,比如給出如下內存數據: 01000001001000100000000000000000 

第一步:符號位為0,表示是正數;  第二步:指數位為10000010,換算成十進制為130,所以指數為130-127=3; 第三步:尾數位為01000100000000000000000,換算成十進制為 (1+1/4+1/64); 所以相應的十進制數值為:2^3*(1+1/4+1/64)=8+2+1/8=10.125


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM