文章目录
引言
在工业通信领域,经常需要用IEEE 754标准以十六进制格式传递浮点数。不同的编程语言,可以有不同的方式实现十六进制转浮点数的方法。比如C/C++可以用共用体实现:
#include <stdio.h>
//共用体实现十六进制与浮点数互转
typedef union test_float
{
float all;
struct
{
unsigned char u8Byte[4];
}stByte;
}FLOAT;
//测试用例
int main()
{
FLOAT a;
a.all =3.14;
printf("0x%X 0x%X 0x%X 0x%X \n",a.stByte.u8Byte[0],a.stByte.u8Byte[1],a.stByte.u8Byte[2],a.stByte.u8Byte[3]);
FLOAT b;
b.stByte.u8Byte[0] = a.stByte.u8Byte[0];
b.stByte.u8Byte[1] = a.stByte.u8Byte[1];
b.stByte.u8Byte[2] = a.stByte.u8Byte[2];
b.stByte.u8Byte[3] = a.stByte.u8Byte[3];
printf("b.all = %f \n",b.all);
return 0;
}
结果:
$ ./test_float.exe
0xC3 0xF5 0x48 0x40
b.all = 3.140000
对于没有C/C++特性的编程语言,如果要实现十六进制转浮点数,除非编程语言提供API,否则可能会有一些转换困难。
通用方法
根据IEEE 754标准的定义:
通用方法就是根据上述位数定义,提取各个值,然后组合即可,实现的C/C++代码如下:
#include <stdio.h>
#include <math.h>
//十六进制数转浮点数通用方法
float Hex2Float(unsigned long number)
{
unsigned int sign = (number & 0x80000000) ? -1 : 1;
unsigned int exponent = ((number >> 23) & 0xff) - 127;
float mantissa = 1 + ((float)(number & 0x7fffff) / 0x7fffff);
return sign * mantissa * pow(2, exponent);
}
//测试用例
int main()
{
//0xC3 0xF5 0x48 0x40 <-->3.14
unsigned long a = 0x4048F5C3;
float result = Hex2Float(a);
printf("result = %f \n",result);
return 0;
}
结果:
$ ./hex2float.exe
result = 3.140000
Javascript代码
function hex2float(num)
{
var sign = (num & 0x80000000) ? -1 : 1;
var exponent = ((num >> 23) & 0xff) - 127;
var mantissa = 1 + ((num & 0x7fffff) / 0x7fffff);
return sign * mantissa * Math.pow(2, exponent);
}