C++单、双精度浮点数16进制转10进制原理及代码
生活随笔
收集整理的這篇文章主要介紹了
C++单、双精度浮点数16进制转10进制原理及代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、浮點數16進制轉10進制原理
浮點數有兩種:單精度float(4字節) 和 雙精度double(8字節)。
1、單精度結構表
| 31 | 30 ~ 23 | 22 ~ 0 |
| 1bit | 8bit | 23bit |
2、雙精度結構表
| 63 | 62 ~ 52 | 51 ~ 0 |
| 1bit | 11bit | 52bit |
3、浮點數 16進制轉10進制原理
公式:
(1)、 (-1)^S表示符號位,當S=0,V為正,S=1,V為負。
(2)、 M表示有效數字,大于等于1,小于2。.
? ? ? ? 單精度 M = 尾數部分十進制 * 2^(-23) + 1;
? ? ? ? 雙精度 M = 尾數部分十進制 * 2^(-52) + 1。
(3)、 E表示指數數部分。
????????單精度 E = 指數部分十進制 - 127;
? ? ? ? 雙精度 E = 指數部分十進制 - 1023;
(4)、單精度浮點數16進制轉10進制,例(42A54FCC):
| 42 A5 4F CC |
| 01000010 10100101 01001111 11001100? |
| 0 |
| 10000101(十進制:133) |
| 0100101 01001111 11001100(十進制:2445260) |
| M = 2^(-23) * 2445260 + 1 = 1.291497707366943359 |
| 2^E = 2^(133 - 127) = 2^6 = 64 |
| V = (-1)^S * M * 2^E =?1 * 1.291497707366943359 * 64 |
| 82.65585327148437498 |
? ? ? ? ·雙精度浮點數計算方式同理。
二、代碼
代碼在Qt上編譯的,沒有Qt可以將QByteArray替換為unsigned? char*類型。
#include <QtCore/QCoreApplication> #include <QDebug>/*單精度浮點數(32位) 16進制轉10進制*/ double hex32_10(QByteArray byteDate) {char* pData = byteDate.data();//符號位 1int sign = int(pData[0] >> 7);//指數位 8int e = int(((pData[0] & 0x7F) << 1) | ((pData[1] >> 7) & 0x01)) - 127;//小數位 23int im = pData[3] & 0xFF;im |= (pData[2] << 8) & 0xFF00;im |= (pData[1] << 16) & 0x7F0000;double m = pow(2, -23) * im + 1;double res = pow(-1, sign) * m * pow(2, e);qDebug() << byteDate.toHex() << QString::number(res, 'f', 12);return res; }/*雙精度浮點數(64位) 16進制轉10進制*/ double hex64_10(QByteArray byteDate) {char* pData = byteDate.data();//符號位 1位int sign = int(pData[0] >> 7);//指數位 11位int e = int(((pData[0] & 0x7F) << 4) & 0x0FF0 | (pData[1] & 0xF0) >> 4) - 1023;//小數位 52位double m = pow(2, -52) * (pow(256, 6) * double(pData[1] & 0x0F) +pow(256, 5) * double(pData[2]) +pow(256, 4) * double(pData[3]) +pow(256, 3) * double(pData[4]) +pow(256, 2) * double(pData[5]) +256 * double(pData[6]) +double(pData[7])) + 1;double res = pow(-1, sign) * m * pow(2, e);qDebug() << byteDate.toHex() << QString::number(res, 'f', 24);return res; }int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QByteArray byteArray_0;byteArray_0.resize(4);byteArray_0[0] = 0x42;byteArray_0[1] = 0xA5;byteArray_0[2] = 0x4F;byteArray_0[3] = 0xCC;hex32_10(byteArray_0);QByteArray byteArray;byteArray.resize(8);byteArray[0] = 0x42;byteArray[1] = 0xA5;byteArray[2] = 0x4F;byteArray[3] = 0xCC;byteArray[4] = 0xBB;byteArray[5] = 0xA8;byteArray[6] = 0xD2;byteArray[7] = 0xC5;hex64_10(byteArray);return a.exec(); }總結
以上是生活随笔為你收集整理的C++单、双精度浮点数16进制转10进制原理及代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试任重而道远
- 下一篇: android 进程通信