用貪心算法計算十進制數轉二進制數(小數部分)

在上一篇博文用貪心算法計算十進制數轉二進制數(整數部分)-CSDN博客中,小編介紹了用貪心算法進行十進制整數轉化為二進制數的操作步驟,那么有朋友問我,那十進制小數轉二進制,可以用貪心算法來計算嗎?我研究了一下,發現也是可以用的,下邊介紹一下操作步驟。

目錄

一、乘2正向取整法

二、十進制小數轉化為二進制小數的數學原理

三、貪心算法

1、貪心算法簡介

2、操作步驟

3、結論


一、乘2正向取整法

在介紹貪心算法之前,還是先介紹一下常用的計算方法,就是“乘2取整”法。

這種方法就是把十進制的小數部分乘2,并記錄得到的積的整數部分,把積的整數部分減掉,再把積的小數部分進行乘2,并記錄得到的積的整數部分,依次乘2取整,直到乘2后得到的積為1,也就是整數部分為1,小數部分為0時,轉化完成。轉化完成后,從上往下(正向)依次把整數部分排列起來,就是轉化后的二進制小數。

圖1 乘2取整法

注意,并不是所有的十進制小數都能精確地轉化為二進制小數。如果出現乘2后的積一直不為1的情況時,此十進制小數就不能精確轉化為二進制小數,只能無限接近。

例如,十進制小數0.15就無法精確地轉換為二進制,轉化的結果為0.001001100110011……循環不盡,無法得到精確轉化值。

二、十進制小數轉化為二進制小數的數學原理

通過觀察圖1,可以看出:

0.6875=1\times 2^{-1}+0\times 2^{-2}+1\times 2^{-3}+1\times 2^{-4}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1)

一般的表達式為:

? ?a=\sum_{i=1}^{i=n}\left ( c_{i}\ast 2^{-i} \right ),c_{i}\in \left \{ 0,1 \right \}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)

十進制小數轉化為二進制小數的過程就是把系數c_{i}i=1i=n(從最高位到最低位)的排列。? ?

在(1)式中,c_{1}=1,c_{2}=0,c_{3}=1,c_{4}=1,所以\left ( 0.6875 \right )_{10}=\left ( 0.1011 \right )_{2}

如果把(1)式中的系數?c_{_i}=0 的項去掉,那么有

0.6875=1\times 2^{-1}+1\times 2^{-3}+1\times 2^{-4}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3)

也就是把十進制小數轉換為二進制小數的過程,實際上就是把十進制小數轉換為若干個以2為底的冪運算之和,那么一般表達式為:

a=\sum_{i=0}^{i=m}2^{-n_{i}}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ?(4)

在(3)式中,n_{0}=1,n_{1}=3,n_{2}=4。也就是在十進制小數0.6825轉換為二進制小數后,數位序號為1,3,4的項系數為1,其他項系數都為0(數位序號從左向右依次增1,最低位序號為1),如表1所示,表格中橙色項系數為1,白色項系數為0。

表1 十進制小數0.6875的二進制轉換結果
位序號1234
位權重1/21/41/81/16
項系數1011
二進制數1011

三、貪心算法

那么如何快速計算出(4)式的n_{i}呢?與十進制整數轉化二進制數類似,也可以用貪心算法進行計算。

1、貪心算法簡介

貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。

2、操作步驟

假設十進制數為a,根據公式(4),用貪心算法思維進行十進制小數轉二進制小數計算的步驟為:

(1)先找出a中最大的那一項2^{-n_{i}},并記錄n_{i}

(2)把最大項的值從???????a中減掉:a=a-2^{-n_{i}}

(3)跳轉到步驟(1)循環計算,直到???????a=0a\leqslant給定極小值,計算結束。

為了人工計算更直觀,我們通常把2^{-n_{i}}寫為小數形式0.5,0.25,0.125,0.0625,0.03125

因此(1)式右邊的指數形式轉化為小數形式

0.6825=1\times 0.5+0\times 0.25+1\times0.125+1\times 0.0625? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (5)

同樣,可以把(3)式改寫為:

0.6825=1\times 0.5+1\times0.125+1\times 0.0625? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (6)

下邊以十進制小數a=0.6875轉化為二進制小數為例,介紹貪心算法的計算步驟:

(1)找出0.6875中最大的項為0.5,也就是2^{-1},記錄n_{0}=1

(2)a=0.6875-0.5=0.1875

(3)找出0.1875中最大的項為0.125,也就是2^{-3},記錄n_{1}=3

(4)a=0.1875-0.125=0.0625

(5)找出0.0625中最大的項為0.0625,也就是2^{-4},記錄n_{1}=4

(6)a=0.0625-0.0625=0,計算結束;

計算的結果為:0.6875=0.5+0.125+0.0625=2^{-1}+2^{-3}+2^{-4}

二進制小數位序號為1,3,4的項為1,其他位序號的項為0,計算結果為\left ( 0.6875 \right )_{10}=\left ( 0.1011 \right )_{2}

3、結論

對比乘2取整法和貪心法,可以發現,對于可以轉化為精確二進制小數的情況來說,貪心算法計算量少,準確率較高,不容易算錯,也更直觀,更好理解和記憶,但是需要我們事先記住一些常用的2^{-n}的值,這樣才有助于我們更快找出最大項。表2為1\leqslant n\leqslant 52^{-n}的值。

表2 常用2為底冪的值

2^{-n}2^{-1}2^{-2}2^{-3}2^{-4}2^{-5}
0.50.250.1250.06250.03125

(本文結束)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20498.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20498.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[C++]vector的模擬實現

下面是簡單的實現vector的功能,沒有涉及使用內存池等復雜算法來提高效率。 一、vector的概述 (一)、抽象數據類型定義 容器:向量(vector)vector是表示大小可以變化的數組的序列容器。像數組一樣&#xf…

帶你學習Mybatis之Mybatis映射文件

Mybatis映射文件 增刪改查 簡單地增刪改查 <select id"selectUser" resultType"User"> select * from user where id #{id}</select><insert id"addUser"> insert into user (name,account) values (#{name},#{account…

[sylar]后端學習:配置環境(一)

1.介紹 基于sylar大神的C高性能后端網絡框架來進行環境配置和后續學習。網站鏈接&#xff1a;sylar的Linux環境配置 2.下載 按照視頻進行下載&#xff0c;并進行下載&#xff0c;并最好還要下載一個vssh的軟件。可以直接在網上搜索即可。 sylar_環境配置&#xff0c;vssh下…

CentOS 運維常用的shell腳本

文章目錄 一、操作系統磁盤空間查看實時獲取系統運行狀態獲取cpu、內存等系統運行狀態獲取系統信息二、應用程序獲取進程運行狀態查看有多少遠程的 IP 在連接本機三、用戶管理統計當前 Linux 系統中可以登錄計算機的賬戶有多少個創建用戶四、自動化管理自動備份日志文件監控的頁…

MySQL常見操作

MySQL字符串連接 在MySQL中&#xff0c;字符串連接可以使用CONCAT()函數或雙豎線||操作符進行。下面是兩種方法的示例&#xff1a; 使用CONCAT()函數&#xff1a; CONCAT(,2001,, ABC)使用雙豎線||操作符&#xff1a; ,2001, || ABC您可以根據自己的偏好選擇其中一種方法來…

TS38.300中的切換流程(很一般)

本文根據3GPP R18 TS 38.300第9.2.3節整理 切換(Handover)是移動終端(UE)進入RRC_CONNECTED狀態后在不同服務小區(Cell)之間保持與網絡聯系唯一手段&#xff0c;期間首先通過控制面(C-Plane)進行無線測量、切換協商及觸發等&#xff1b;為此3GPP在TS38.300中定義如下。 RAN系統…

shardingsphere5 自定義分片(sharding-algorithm)算法

背景 在做分表時&#xff0c;需要自定義算法。 這里實現的算法是&#xff1a; 分表字段的 hashCode 取余。 算法 public class UserShardingAlgorithm implements StandardShardingAlgorithm<String> {public static String type "USER_SHARDING_STRATEGY"…

2024KCon大會議題招募火熱進行中

歷時1個多月我們收到了來自全國各地小伙伴們的議題投遞既有前瞻性的技術研判亦有安全領域的最新策略......感謝每一位對KCon大會傾注熱情與支持的你&#xff01; 我們也收到了不少小伙伴的私信&#xff0c;有的因為工作繁忙有的因為在緊張備戰2024網絡安全攻防演練表示原定的時…

LeetCode2542最大子序列的分數

題目描述 給你兩個下標從 0 開始的整數數組 nums1 和 nums2 &#xff0c;兩者長度都是 n &#xff0c;再給你一個正整數 k 。你必須從 nums1 中選一個長度為 k 的 子序列 對應的下標。 對于選擇的下標 i0 &#xff0c;i1 &#xff0c;…&#xff0c; ik - 1 &#xff0c;你的 …

監控易監測對象及指標之:全面監控LDAP服務器

隨著企業信息化建設的不斷深入&#xff0c;LDAP&#xff08;輕量級目錄訪問協議&#xff09;服務器作為重要的目錄服務組件&#xff0c;其穩定性和性能直接關系到企業業務的連續性和 效率。為了確保LDAP服務器的穩定運行和高效性能&#xff0c;對其進行全面監控顯得尤為重要。…

Kafka原生API使用Java代碼-消費者組-消費模式

文章目錄 1、消費模式1.1、創建一個3分區1副本的 主題 my_topic11.2、創建生產者 KafkaProducer11.2、創建消費者1.2.1、創建消費者 KafkaConsumer1Group1 并指定組 my_group11.2.3、創建消費者 KafkaConsumer2Group1 并指定組 my_group11.2.3、創建消費者 KafkaConsumer3Group…

算法練習第25天|491. 非遞減子序列

491. 非遞減子序列 491. 非遞減子序列https://leetcode.cn/problems/non-decreasing-subsequences/ 題目描述&#xff1a; 給你一個整數數組 nums &#xff0c;找出并返回所有該數組中不同的遞增子序列&#xff0c;遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案…

Flutter 中的 ButtonTheme 小部件:全面指南

Flutter 中的 ButtonTheme 小部件&#xff1a;全面指南 Flutter 是一個由 Google 開發的跨平臺 UI 框架&#xff0c;它提供了一系列的組件來幫助開發者構建美觀且功能豐富的應用。在 Flutter 的組件庫中&#xff0c;ButtonTheme 是一個重要的小部件&#xff0c;它允許開發者統…

Linux、Windows安裝python環境(最新版及歷史版本指定版本)-python

目錄 一、Linux環境二、windows環境最新版本下載指定版本下載 python 官網地址&#xff1a; https://www.python.org/ 一、Linux環境 以openEuler/CentOS為例 查看可安裝python源版本 dnf provides python*默認安裝新版本 dnf install -y python3. 進入python python退出p…

電源小白入門學習8——電荷泵電路原理及使用注意事項

電源小白入門學習8——電荷泵電路原理及使用注意事項 電荷泵簡介電荷泵原理電荷泵設計過程中需要注意的點fly電容的安秒平衡DC/DC功率轉換技術對比 電荷泵簡介 電荷泵&#xff08;Charge Pump&#xff09;是一種電路拓撲結構&#xff0c;用于實現電壓升壓或降壓的功能。它通過…

Python自動化測試斷言詳細實戰代碼(建議收藏)

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 在測試用例中&#xff0c;執行完測試用例后&#xff0c;最后一步是判斷測試結果是 pass 還是 fa…

sh發送郵件如何通過配置SMTP服務器來實現?

sh發送郵件的操作方法&#xff1f;如何使用Shell腳本自動發信&#xff1f; 在Shell腳本中實現郵件發送功能是一項常見需求&#xff0c;特別是在自動化任務執行或系統監控中。AokSend將介紹如何通過配置SMTP服務器來實現sh發送郵件的方法和注意事項。 sh發送郵件&#xff1a;安…

Redash、Superset、DataEase、Metabase、FineBI 和 Power BI 報表系統的優缺點

最近在做報表系統的選型與調研&#xff0c;其中嘗試了Redash、Superset、DataEase、Metabase、FineBI 和 Power BI幾個報表系統&#xff0c;主要想使用開源免費的&#xff0c;如果大家有好用的報表系統推薦歡迎留言。 Redash 優點&#xff1a; 開源且免費&#xff1a;Redash…

【已解決】Error in the HTTP2 framing layer

1.問題描述 在使用git將代碼上傳github的時候在最后一部push的時候遇到這個fatal 2.解決方案 由于我原先設置的origin是http協議下的&#xff0c;如下 git remote add origin https://github.com/Charlesbibi/Simple_Cloud.githttp協議下行不通不妨試一試ssh協議下&#xff…

跟風報考PMP,我真的后悔了

真的太香吧&#xff01; 我一開始沒打算報考PMP證書的&#xff0c;但是我看身邊很多朋友都因為PMP證書得到了升職加薪&#xff0c;這讓我實在是一整個羨慕住了&#xff0c;所以我也去報考了PMP。 報考PMP前期我做了什么&#xff1f; 由于我是零基礎&#xff0c;沒有什么項目…