感謝原作者。
關於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為止,將...