1. 程式人生 > >C語言浮點數存儲方式

C語言浮點數存儲方式

你是 jsb 換算 格式 其中 存儲格式 watermark 一位 ssa

對於浮點類型的數據采用單精度類型(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

C語言浮點數存儲方式