十六进制转浮点数的通用方法

引言

在工业通信领域,经常需要用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标准的定义:IEEE754浮点数位数定义
通用方法就是根据上述位数定义,提取各个值,然后组合即可,实现的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);
}
  • 5
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值