日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++单、双精度浮点数16进制转10进制原理及代码

發布時間:2023/12/20 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++单、双精度浮点数16进制转10进制原理及代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、浮點數16進制轉10進制原理

浮點數有兩種:單精度float(4字節) 和 雙精度double(8字節)。

1、單精度結構表

符號位 Sign (S)指數部分 Exponent (E)尾數部分 Mantissa (M)
3130 ~ 2322 ~ 0
1bit8bit

23bit

2、雙精度結構表

符號位 Sign (S)指數部分 Exponent (E)尾數部分 Mantissa (M)
6362 ~ 5251 ~ 0
1bit11bit

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):

十六進制二進制符號位(S)指數部分尾數部分M 計算2^E 計算十進制計算 V十進制結果 V

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进制原理及代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。