基礎知識:
十進位制轉十六進製制;
十六進製制轉二進位制;
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在記憶體中明明是同乙個數,為什麼浮...