天天看點

C語言:浮點數在記憶體中的表示

單精度浮點數: 1位符号位   8位階碼位   23位尾數

雙精度浮點數: 1位符号位  11位階碼位   52位尾數

實數在記憶體中以規範化的浮點數存放,包括數符、階碼、尾數。數的精度取決于尾數的位數。比如32位機上float型為23位       double型為52位。

單精度float型存儲在記憶體中的大小為4個位元組,即32位。

浮點表示的一般形式為:R=M*2^e (R:Real       M:Mantissa尾數     e:exponent階碼)

把上面float的二進制可分成三部分:

   x                   xxxxxxxx             xxxxxxxxxxxxxxxxxxxxxxx

數符(1b)         階碼(8b)         尾數(23b)

double型的浮點數分别是:數符(1b)、階碼(8b)、尾數(52b)

數符sign:real的正負号     "+":0        "-":1

階碼e:e=E-127(double型中e=E-1023) e為正值說明這個浮點數向左移動了e位, e為負值說明這個浮點數向右移動了e位。127=2^7-1 1023=2^10-1

尾數M:有效數字位,這裡是有效數字位的部分二進制碼

例1:float型浮點數125.5轉化成32位二進制浮點數

125.5的二進制碼為1111101.1,寫成二進制的科學計數為:1.111101*2^6(因為科學計數法“整數”部分大于1,在二進制中,“整數”部分隻能恒為1)即向左移6位,則e=6,則E=e+127=133,而E的二進制碼為10000101,而1.111101把“整數”部分去除1之後為111101,之後補0,共23b,形成了階碼。

是以125.5的32位二進制浮點數為

0 10000101 11110100000000000000000

例2:float型浮點數0.5轉化成32位二進制浮點數

0.5的二進制碼為0.1,寫成二進制的科學計數為:1.0*2^(-1)即向右移1位,則e=-1,則E=e+127=126,而E的二進制碼為01111110,而1.0把“整數”部分去除1之後為0,之後補0,形成了階碼。

是以0.5的32位二進制浮點數為

0 01111110 00000000000000000000000

double型浮點數類似。

例3:32位二進制浮點數為0 10000010 00010000000000000000000轉化成十進制數浮點數

題中已給我們分了三部分,數符部分、階碼部分、尾數部分。

數符部分為0,則代表此數為正數;階碼部分為10000010,則E=130,則e=E-127=3,則說明其向左移了3位,0001加上“整數”部分的1之後,為1.0001。則原二進制數為1000.1=十進制8.5,或R=1.0001*2^3=8.5

其中很多計算類似。可舉一反三!

繼續閱讀