在上一篇博文用貪心算法計算十進制數轉二進制數(整數部分)-CSDN博客中,小編介紹了用貪心算法進行十進制整數轉化為二進制數的操作步驟,那么有朋友問我,那十進制小數轉二進制,可以用貪心算法來計算嗎?我研究了一下,發現也是可以用的,下邊介紹一下操作步驟。
目錄
一、乘2正向取整法
二、十進制小數轉化為二進制小數的數學原理
三、貪心算法
1、貪心算法簡介
2、操作步驟
3、結論
一、乘2正向取整法
在介紹貪心算法之前,還是先介紹一下常用的計算方法,就是“乘2取整”法。
這種方法就是把十進制的小數部分乘2,并記錄得到的積的整數部分,把積的整數部分減掉,再把積的小數部分進行乘2,并記錄得到的積的整數部分,依次乘2取整,直到乘2后得到的積為1,也就是整數部分為1,小數部分為0時,轉化完成。轉化完成后,從上往下(正向)依次把整數部分排列起來,就是轉化后的二進制小數。

注意,并不是所有的十進制小數都能精確地轉化為二進制小數。如果出現乘2后的積一直不為1的情況時,此十進制小數就不能精確轉化為二進制小數,只能無限接近。
例如,十進制小數0.15就無法精確地轉換為二進制,轉化的結果為0.001001100110011……循環不盡,無法得到精確轉化值。
二、十進制小數轉化為二進制小數的數學原理
通過觀察圖1,可以看出:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1)
一般的表達式為:
? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)
十進制小數轉化為二進制小數的過程就是把系數從
到
(從最高位到最低位)的排列。? ?
在(1)式中,,所以
。
如果把(1)式中的系數? 的項去掉,那么有
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3)
也就是把十進制小數轉換為二進制小數的過程,實際上就是把十進制小數轉換為若干個以2為底的冪運算之和,那么一般表達式為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ?(4)
在(3)式中,。也就是在十進制小數0.6825轉換為二進制小數后,數位序號為1,3,4的項系數為1,其他項系數都為0(數位序號從左向右依次增1,最低位序號為1),如表1所示,表格中橙色項系數為1,白色項系數為0。
位序號 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
位權重 | 1/2 | 1/4 | 1/8 | 1/16 |
項系數 | 1 | 0 | 1 | 1 |
二進制數 | 1 | 0 | 1 | 1 |
三、貪心算法
那么如何快速計算出(4)式的呢?與十進制整數轉化二進制數類似,也可以用貪心算法進行計算。
1、貪心算法簡介
貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。
2、操作步驟
假設十進制數為,根據公式(4),用貪心算法思維進行十進制小數轉二進制小數計算的步驟為:
(1)先找出中最大的那一項
,并記錄
;
(2)把最大項的值從???????中減掉:
(3)跳轉到步驟(1)循環計算,直到???????或
給定極小值,計算結束。
為了人工計算更直觀,我們通常把寫為小數形式0.5,0.25,0.125,0.0625,0.03125。
因此(1)式右邊的指數形式轉化為小數形式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (5)
同樣,可以把(3)式改寫為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (6)
下邊以十進制小數轉化為二進制小數為例,介紹貪心算法的計算步驟:
(1)找出0.6875中最大的項為0.5,也就是,記錄
;
(2);
(3)找出0.1875中最大的項為0.125,也就是,記錄
;
(4);
(5)找出0.0625中最大的項為0.0625,也就是,記錄
;
(6),計算結束;
計算的結果為:0.6875=0.5+0.125+0.0625=
二進制小數位序號為1,3,4的項為1,其他位序號的項為0,計算結果為。
3、結論
對比乘2取整法和貪心法,可以發現,對于可以轉化為精確二進制小數的情況來說,貪心算法計算量少,準確率較高,不容易算錯,也更直觀,更好理解和記憶,但是需要我們事先記住一些常用的的值,這樣才有助于我們更快找出最大項。表2為
的
的值。
值 | 0.5 | 0.25 | 0.125 | 0.0625 | 0.03125 |
(本文結束)