2009年11月8日 星期日

十進位含小數轉二進位的方法

這裏有個網址,把「小數部份的轉二進位程序」例舉得很清楚。

http://www.gamez.com.tw/thread-379810-1-1.html

基本上,和十進位同樣理,在小數點之前(整數)其權重值分別為22,21,20,(亦即4,2,1),而在小數點之後其權重值分別為2-1,2-2,2-3, (亦即1/2,1/4,1/8)。整個來說,一個包含三位整數及三位小數的二進位值其各位數字之權重值如下

22,21,20,2-1,2-2,2-3

在上面這個網址所附的範例,每乘一次2,就是把整個二進位值往左移位一次。那麼,小數值每乘一次2後,從小數點左邊冒出的,就是剛才位在小數點右邊的那一個二進位值。雖然我們是用十進值來乘,但乘完後的值是相同的,所以,每次乘完後,冒在左邊的不是0就是1。(當然,每次乘時,要把先前的整數部份拿掉,只乘小數部份,才會如此)。你可以在紙上用二進值來試試,一目了然。

為了怕以後網址有變,我把上面網址的內容貼在後面

0.875
× 2
 ̄ ̄ ̄ ̄
1.750 → 取小數前的 1 →①

0.750 ← 前一計算的乘積只取小數部份
× 2
 ̄ ̄ ̄ ̄
1.500 → 取小數前的 1 → ②

0.500 ← 前一計算的乘積只取小數部份
× 2
 ̄ ̄ ̄ ̄
1.000 → 取小數前的 1 → ③

依①②③的順序,十進位 0.875 為二進位 0.111

其他情況給你參考
0.300
× 2
 ̄ ̄ ̄ ̄
0.600 → 取小數前的 0 → ①
0.600
× 2
 ̄ ̄ ̄ ̄
1.200 → 取小數前的 1 → ②
0.200
× 2
 ̄ ̄ ̄ ̄
0.400 → 取小數前的 0 → ③
0.400
× 2
 ̄ ̄ ̄ ̄
0.800 → 取小數前的 0 → ④
0.800
× 2
 ̄ ̄ ̄ ̄
1.600 → 取小數前的 1 → ⑤ → 從這裡可以發現又回到①的情況

因此 十進位的 0.3 是乘不進二進位的,會變成 0.010011001循環浮點數

沒有留言:

張貼留言