tft每日頭條

 > 生活

 > 浮點數如何轉換成十進制

浮點數如何轉換成十進制

生活 更新时间:2024-07-21 20:10:23

1、如何将浮點數轉換成二進制呢?

簡單概括起來,同樣也是一句話:

整數部分依舊采用“除2取餘,逆向取值”的方法;而小數部分則乘2取整,直到餘下的小數為0或者滿足精度要求為止,然後順序取值(即最先得到的整數為最高位,最後得到的整數為最低位)。

比如:58.625

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)1

所以,最終結果就是:11 1010.101。

若采用科學計數法來表示的話,就是:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)2

其中,指數2就如同十進制中的科學計數法中的指數10一樣;10是2的二進制,101是5的二進制。

在IEEE-754标準中,浮點數的存儲格式是這樣的:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)3

S是符号位,用來表示正負,0表示正,1表示負,隻占1bit。

E是指數位,用來存儲“浮點數表示成科學計數法形式時”的幂次。注意:E=常數 e,其中e就是2的幂次。

M是尾數,就是浮點數表示成科學計數法形式時小數點後面的數。

如果将上面的例子表示成這種形式的話,那就是:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)4

其中,5=E-常數=e,M=0.11010101,S=0。

我們知道浮點數分為單精度和雙精度。

若是單精度,則占4個字節,E占8位,M占23位,再加上S段,總共就是32位,剛好也是4個字節,兩者是一緻的。

若是雙精度,則占8個字節,E占11位,M占52位,再加上S段,總共就是64位,剛好也是8個字節,這兩者也是一緻的。

1、那麼,如果58.625是單精度浮點數,那它在内存中的二進制存儲是怎麼樣的呢?

首先,我們先要明确一個前提:

若是單精度,那麼E就占8位,取值範圍就是0~255,且e=E-127,所以e的取值範圍就是-127~128。

那麼,接下來,我們就可以開始計算了:

顯然,S=0,因為58.625是正數。

而E=e 127=5 127=132,轉換成二進制就是1000 0100。

M則取小數部分,所以M=1101 0101。

所以,最終58.625在内存存儲的二進制就是:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)5

由于單精度占4個字節,所以要在不改變數值的大小的前提下将位數補齊,所以才在小數後面補0。

若是-58.625,那就隻需把S改成1即可,其他位不變。

2、如果58.625是雙精度浮點數,那它在内存中的二進制存儲是怎麼樣的呢?

同樣,首先,我們需要明确一個前提:

若是雙精度,那麼E就占11位,取值範圍就是0~2047(即2048-1=2^11-1),且e=E-1023,所以e的取值範圍就是-1023~1024。

接下來,我們再開始計算雙精度的二進制:

顯然,S=0,因為58.625是正數。

而E=e 1023=5 1023=1028=1028的二進制。

M則同樣取小數部分,所以M=1101 0101。

所以,雙精度的58.625在内存中的二進制存儲就是:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)6

同樣,若是-58.625,則隻需把S改成1即可,其他位不變。

補充:二進制浮點數如何轉換成十進制浮點數?

依舊以單精度的58.625為例。

由前面可知,單精度的58.625的二進制為:

0 1000 0100 110 1010 1000 0000 0000 0000

首先,計算出指數的幂次:

明确一個前提:E=e 127

所以,E=1000 0100=132

所以,e=E-127=132-127=5

又由于S=0,所以該數值為正數。

所以,

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)7

好了,我們已經把“在内存中存儲的浮點數的二進制”轉換成了“我們比較好識别的浮點數的二進制”,即“能夠區分出整數部分和小數部分”的浮點數的二進制。

整數部分的二進制轉換成十進制,這裡我們就不再贅述了。方法和普通的“十進制整數與二進制之間的轉換”一樣。重點和難點在于,如何将小數部分的二進制轉換成十進制。那麼,怎麼轉換呢?

首先要明确一點:小數部分是0.101

其次,将小數部分的二進制轉換成十進制,其方法其實和“二進制整數轉換成十進制整數”的方法是類似的,隻不過,指數的幂次是負數。具體過程如下:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)8

最後,把所計算出的十進制浮點數的整數部分和小數部分相加,就得到了最終的結果,即58.625。

但是,有一點需要注意:假設當初在将浮點數的小數部分由十進制轉換成二進制時,隻是計算到了“滿足精度要求”為止,而并沒有或者無法計算到“餘下的小數為0”為止,這時,如果再用這種方法将二進制浮點數的小數部分轉換成十進制,那麼所計算出的十進制小數就會與實際的十進制浮點數的小數部分之間産生誤差。

但如果當初在将浮點數的小數部分由十進制轉換成二進制時所取的精度越大(即有效小數位數越多),那麼這誤差就會越小。

對于“将雙精度的58.625的二進制轉換成十進制”,也是同樣的計算方法。這裡就不再贅述了。隻不過,需要注意的是E=e 1023;至于其他步驟,則都一樣。

補充:二進制浮點數的小數部分轉換成十進制的原理

其實,“二進制浮點數的小數部分轉換成十進制”的原理,和“二進制整數轉換成十進制整數”的原理類似。

我們先來回顧一下,十進制浮點數的小數部分是如何轉換成二進制的。

依舊以58.625為例。轉換過程如下:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)9

然後,從上往下順序取整,即得到0.625的二進制數為0.101。

接下來,我們反過來推導,将二進制數0.101轉換回十進制數0.625。具體過程如下:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)10

于是,最終就得到了:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)11

顯然,這個多項式中最左邊項的系數1就是二進制數0.101的最低位,而最右邊項的系數1就是二進制數0.101的最高位。所以,可以得到:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)12

以上例子是一個“小數由十進制轉換到二進制時可以算到‘餘下的小數為0’為止”的小數。

但對于“小數由十進制轉換到二進制時隻能算到‘滿足精度要求’為止”的小數,采用這種方法将二進制小數轉換成十進制小數,則所計算出的結果會與實際的十進制小數之間産生誤差。但若之前所取的精度越高(即二進制小數位數越多),則該誤差就會越小。

比如:0.734就是一個“隻能算到‘滿足精度要求’為止”的小數。

首先,我們将0.734轉換成二進制,過程如下:

0.734×2=1.468……1

0.468×2=0.936……0

0.936×2=1.872……1

0.872×2=1.744……1

0.744×2=1.488……1

0.488×2=0.976……0

……

顯然,不管乘以多少次2,所得的乘積的小數部分都不可能為0,所以隻能取一定精度。現假設,精度就是6位有效二進制數,那麼,順序取值而所得的0.734的二進制就是0.101110。

然後,我們再用上面的方法将二進制小數轉換回十進制小數,具體過程如下:

浮點數如何轉換成十進制(浮點數十進制與二進制之間的轉換)13

顯然,根據上面的方法所計算的結果要比實際結果0.734小,但也已經很接近0.734了。如果前面所取的精度再高一些、位數再多一些,那麼所計算的結果将會更接近0.734。

這也就是為什麼前面會說“有誤差”的原因了。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved