1. 程式人生 > >還不會浮點數轉二進位制?下次有人問你,直接把這篇文章扔給他

還不會浮點數轉二進位制?下次有人問你,直接把這篇文章扔給他

> 作為一名程式猿,假如某一天,有一個妹子拿著一個浮點數,求你教她怎麼換算成二進位制,如果你不能單手求出來,你都不能算一個合格的工具人.....好吧,是一個合格的程式猿(狗頭保命)。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702100810265.jpg#pic_center) 迴歸正題,有好多小夥伴去工作之後,早已經忘了最基本的計算機基礎,今天,來講下,在計算機中,怎麼用二進位制表示浮點數?下次再有人問你,就把這篇文章丟給他。 作為一種資料型別,浮點數應用廣泛。在處理諸如訂單交易、貨幣計算、或者商品金額的方面,應該小心慎用浮點數。在定義浮點數變數的時候,不完全理解原理,就容易出現各種揪心的問題。 那麼,正題來了。 浮點數在計算機中的儲存方式遵循**IEEE 754浮點數的計數標準**,那麼,IEEE 754浮點數的計數標準怎麼表示浮點數的? - **浮點數數學表示:** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702102615580.png) - **符號位(sign):決定該浮點數的正負** - **尾數(significand):二進位制小數,範圍在[1,2)或者[0,1)中** - **階碼(exponent):對浮點數加權,權重為2的E次冪** IEEE標準754規定了三種浮點數格式:單精度、雙精度、擴充套件精度。前兩者正好對應C語言裡頭的float、double,限於篇幅,本文僅討論單精度、雙精度浮點格式。 其實,IEEE754標準可以概括成一張圖片,如下 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702104235104.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY5NTk5NQ==,size_16,color_FFFFFF,t_70#pic_center) 採用**尾數+階碼**的編碼方式。其實就是在我們學過的數學知識中,就是類似於科學計數法。即有**效數字+指數位**。 所以,只要給出:符號(S)、尾數部分(M)、階碼部分這三種資訊,就可以正確的表示一個浮點數。在C語言中,浮點數的資料型別最常用的就是float、double,那麼,他們在計算機中的儲存結構是怎樣的呢? ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702113203644.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY5NTk5NQ==,size_16,color_FFFFFF,t_70#pic_center) ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702113346124.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY5NTk5NQ==,size_16,color_FFFFFF,t_70#pic_center) 浮點數的各個部分的含義如下表格所示 | 符號部分(S) | 階碼部分(E) | 尾數部分(M) | | :-: | :-: | :-: | | 0表示正(+),1表示負(-) | 階碼部分其實就是指數部分 `float` 指數部分8位,可以表示的指數範圍位-127~128 `double` 指數部分11位,可以表示的指數範圍位-1023~1024 | 決定浮點數的精度 `float` 尾數部分23位,換算成十進位制為2^23^ =8388608,因此精度為6~7位 `double` 尾數部分23位,換算成十進位制為2^52^ =4503599627370496,因此精度為15~16位 | #### 結論 浮點數交給計算機儲存的,可能會有**精度的丟失問題**,出了問題的話,在大型的專案中,是很難找出問題的,因此提前做好規劃與計算是有必要的。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702173133869.jpg#pic_center) #### 計算例項 **第一個例子** **把十進位制小數0.475轉換成二進位制,具體應該怎麼操作?** **1. 將小數劃分成整數+小數兩部分** **2. 整數部分轉換** 轉換採用**除2取餘法**,此處的`0.475`的整數部分為0,不需要操作。 **3. 小數部分轉換** 轉換採用**乘2取整法**。詳細看下圖 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702202226626.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY5NTk5NQ==,size_16,color_FFFFFF,t_70#pic_center) **3. 合併結果** `整數部分+小數部分`,得到二進位制結果為 0.101. 根據IEEE754標準,即**符號位+尾數+階碼**的計數方式,可以表示為 #### 1.01 × 2^-1^ - **符號位**:0 - **階碼部分**:以**float**為例子,則為 127 + (-1)=126,所以二進位制為:01111110 - **尾數部分**:以**floa**t為例子,應為 23位,尾數補齊之後為0100000000000000000000 最終結果為(以float表示) 0011111100100000000000000000000 **第二個例子** **把十進位制小數8.26轉換成二進位制,具體應該怎麼操作?** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702214607623.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY5NTk5NQ==,size_16,color_FFFFFF,t_70#pic_center) `整數部分+小數部分` 得到二進位制結果為**1000.0100001 .....** 根據IEEE754標準,即**符號位+尾數+階碼**的計數方式,可以表示為 #### 1.0000100001 × 2 ^3^ - **符號位**:0 - **階碼部分**:以**float**為例子,則為 127 + (3)=130,所以二進位制為:10000010 - **尾數部分**:`0.0000100001...,`,它本身無限不迴圈,但是如果以 **floa**t 為例子,擷取 23位,表示為00001000010100011110110 最終結果為(以float表示) 01000001 00000100 00101000 11110110 因此,對於這種無限位數的小數,用計算機去儲存必然會導致**精度的損失**。所以,各位在使用過程中一定要謹慎小心。 #### 結語 浮點數轉換為二進位制就講解到這裡了,覺得有用的老鐵們,請點贊關注我吧,另外,關注我的老鐵們可以私聊我,獲取**浮點數轉換為二進位制的神器**,這樣子,再也不用自己手撕浮點數轉為二進位制了。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200702220511951.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY5NTk5NQ==,size_16,color_FFFFFF,t_70#pic_center) ## 如果覺得我寫的不錯的話,幫個忙唄 ##### 1.關注我的知乎賬號小叢,上面有我的文章同步,同時需要詢問學習計算機經驗的話,也歡迎私聊。 ##### 2.點贊,關注我,這是對我最大的鼓勵了,有了你們的鼓勵,我會寫出更多的優質文章。