浮點數的二進位制表示

2021-06-22 08:34:56 字數 2750 閱讀 8755

基礎知識:

十進位制轉十六進製制;

十六進製制轉二進位制;

ieee制定的浮點數

表示規則;

了解:

目前c/c++編譯器標準都遵照ieee制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把乙個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:

符號位階碼尾數長度

float           1          8        23      32

double          1         11        52      64

以下通過幾個例子講解浮點數如何轉換為二進位制數

例一:已知:double型別38414.4。

求:其對應的二進位制表示。

分析:double型別共計64位,折合8位元組。由最高到最低位分別是第63、62、61、……、0位:

最高位63位是符號位,1表示該數為負,0表示該數為正;

62-52位,一共11位是指數字;

51-0位,一共52位是尾數字。

步驟:按照ieee浮點數表示法,下面先把38414.4轉換為十六進製制數。

把整數部和小數部分開處理:整數部直接化十六進製制:960e。小數的處理:

0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……

實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了。隱藏位技術:最高位的1不寫入記憶體(最終保留下來的還是52位)。

如果你夠耐心,手工算到53位那麼因該是:38414.4(10)=1001011000001110.

0110011001100110011001100110011001100(2)

科學記數法為:1.001011000001110

0110011001100110011001100110011001100,右移了15位,所以指數為15。或者可以如下理解:

1.001011000001110 0110011001100110011001100110011001100

×2^15

於是來看階碼,按ieee標準一共11位,可以表示範圍是-1024 ~ 1023。因為指數可以為負,為了便於計算,規定都先加上1023(2^10-1),在這裡,階碼:15+1023=1038。二進位制表示為:100 00001110;

符號位:因為38414.4為正對應為0;

合在一起(注:尾數二進位制最高位的1不要):

01000000 11100010 11000001 110

01100  11001100  11001100  11001100  11001100

例二:

已知:整數3490593(16進製表示為0x354321)。

求:其對應的浮點數3490593.0的二進位制表示。

解法如下:

先求出整數3490593的二進位制表示:

h:    3     5    4    3    2     1   

(十六進製制表示)

b:   001

1  0101 0100 0011 0010  0001 

(二進位制表示)

│←─────  21────→│

即: 1.1010101000011001000012×

221

可見,從左算起第乙個1後有21位,我們將這21為作為浮點數的小數表示,單精度浮點數float由符號位1位,指數域位k=8位,小數域位(

尾數)n=23位構成,因此對上面得到的21位小數字我們還需要補上2個0,得到浮點數的小數域表示為:

1 0101 0100 0011 0010 0001 00

float

型別的偏置量bias=2k-1-1=28-1-1=127

,但還要補上剛才因為右移作為小數部分的

21位,因此偏置量為

127+21=148

,就是ieee

浮點數表示標準:

v = (-1)s×m

×2ee = e-bias 中的

e,此前計算

bias=127

,剛好驗證了

e=148-127=21。

將148轉為二進位制表示為

10010100

,加上符號位

0,最後得到二進位制浮點數表示

1001010010101010000110010000100

,其16

進製表示為:

h:     4        a       5          5         0         c         8        4  

b:  0

100   1010   0101    0101   0000   1100  1000   0100

|←────      21        ─────→   |

1|←─8   ─→||←─────       23       ─────→ |

這就是浮點數

3490593.0(0x4a550c84)

的二進位制表示。

浮點數的二進位制表示

前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶體中明明是同乙個數,為什麼浮點數...

浮點數的二進位制表示

日期 2010年6月 6日 1.前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶...

浮點數的二進位制表示

1.前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶體中明明是同乙個數,為什麼浮...