16進製制與浮點數轉換

2021-07-01 18:33:55 字數 1813 閱讀 8890

感謝原作者。

關於16進製制浮點數

對於大小為32-bit的浮點數(32-bit為單精度,64-bit浮點數為雙精度,80-bit為擴充套件精度浮點數), 

1、其第31 bit為符號位,為0則表示正數,反之為複數,其讀數值用s表示; 

2、第30~23 bit為冪數,其讀數值用e表示; 

3、第22~0 bit共23 bit作為係數,視為二進位制純小數,假定該小數的十進位制值為x;

則按照規定,該浮點數的值用十進位制表示為: 

= (-1)^s * (1 + x) * 2^(e - 127)

對於49e48e68來說, 

1、其第31 bit為0,即s = 0 

2、第30~23 bit依次為100 1001 1,讀成十進位制就是147,即e = 147。 

3、第22~0 bit依次為110 0100 1000 1110 0110 1000,也就是二進位制的純小數0.110 0100 1000 1110 0110 1000,其十進位制形式為0.78559589385986328125,即x = 0.78559589385986328125。

這樣,該浮點數的十進位制表示 

= (-1)^s * (1 + x) * 2^(e - 127) 

= (-1)^0 * (1+ 0.78559589385986328125) * 2^(147-127) 

= 1872333

以上內容為ieee的標準,現在有個問題,假設我有兩台裝置在通訊,乙個裝置向另外乙個裝置傳送資料,這個資料是浮點數,那麼我怎麼來傳送這個資料呢?怎麼讓接受方知道傳送來的是個浮點數呢?而且傳送資料要盡量短,最好還要固定長度,也許有人會怎麼做:a傳送資料3.7586給b,a先將這個浮點數乘以10000變成整型37586,然後將這個整數傳送給b,這樣使用的弊端是:1、b要事先知道a將這個數字放大了多少倍。2、a需要做一次浮點數的乘法運算,而b要做一次浮點數的除法運算,這對於微控制器來說是個負擔。3、這樣使用會多占用傳送資料。因為事先沒人知道這個浮點數到底多大。

想了半天,覺得使用ieee的浮點數規則來傳送是最可靠的,因為任何浮點數都被表示成4個位元組,這對傳送和接收雙方都是個好訊息,只要雙方都知道要進行浮點數的傳送就可以了。而且ieee格式浮點數的轉換是機器內部執行的,我們不再需要任何的轉換,不增加運算量,不增加**量。

按照這個原則,編寫了測試**如下:

傳送方a:

float fsend; //a需要傳送的浮點資料

char chsend[4]; //傳送緩衝,經過轉換後的浮點資料,變成乙個字元型陣列。

//以下為轉換

chsend[0] = *((char *)(&fsend));

chsend[1] = *((char *)(&fsend) + 1);

chsend[2] = *((char *)(&fsend) + 2);

chsend[3] = *((char *)(&fsend) + 3);

此時a就可以將這個數字傳送給b了,b接收到的是4個位元組表示的乙個浮點數,但需要經過如下轉換使用:

float freceive; //接收到的浮點數

char chreceive[4];//接收緩衝。b將接收到的4個位元組儲存在這裡。

//以下為轉換

*((char *)(&freceive)) = chreceive[0];

*((char *)(&freceive) + 1) = chreceive[1];

*((char *)(&freceive) + 2) = chreceive[2];

*((char *)(&freceive) + 3) = chreceive[3];

好了,此時的b已經得到了乙個浮點數freceive;

python如何將浮點數轉換為16進製制的數

最佳答案 這在python中有點棘手,因為不希望將浮點值轉換為 十六進製制 整數.相反,您嘗試將浮點值的ieee 754二進位制表示解釋為十六進製制.我們將使用內建struct庫中的pack和unpack函式.浮點數是32位.我們首先將它打包成binary1字串,然後將其解壓縮為int.def fl...

16進製制字串轉化為浮點數

參考資料 1.2.3.問題 有時候在傳輸過程中會把浮點數使用如下形式儲存為二進位制形式 memcpy ibuf 4,f c0,sizeof float memcpy ibuf 4 4,f c1,sizeof float 在另一端怎麼將十六進製制形式的資料轉為浮點數呢?以下是簡單實現 include ...

十進位制浮點數轉換為二進位制

浮點數儲存 浮點數在計算機中儲存也是以二進位制的形式,遵循ieee二進位制算數標準 格式為 float 符號位 首位 指數字 8位 尾數 23位 double 符號位 首位 指數字 11位 尾數 52位 十進位制浮點數轉換為二進位制 方法 整數部分 除以2,取出餘數,商繼續除以2,直到得到0為止,將...