IEEE754浮点数精度转换

本文介绍如何将从温度采集模块通过串口返回的16进制IEEE754数据转换为浮点数。提供了Java和Python两种语言的实现方式,深入解析了浮点数在计算机中的存储格式。

最近在利用串口读取温度采集模块上面的数据时发现返回过来的数据是16进制的IEEE754类型,很显然这不是我们想要看到的,因此我们必须对他进行解析:
因为我用的是Java,所以首先翻了相关文档,发现还真提供的有:

Float.intBitsToFloat(hex)

当然自己也可以手写一个,这时我们就需要了解浮点数在计算机中是如何表示的了:
在计算机中,浮点数的存储均采用4字节的IEEE-754格式,如,浮点数32.375的IEE表示形式如下
1641975-20190707222852091-32291306.png

Java代码实现:

 public static  double transfer(String hexStr){
    StringBuffer  binaryStr = new StringBuffer();
         for(int i=0;i< hexStr.length();i+=2){
        String a = hexStr.substring(i,i+2);
                int c = Integer.parseInt(a,16);
                String item = String.format("%08d",Integer.parseInt(Integer.toBinaryString(c)));
                binaryStr.append(item);
              }
    int n =  Integer.parseInt(binaryStr.substring(1,9),2);
        String mStr = binaryStr.substring(9,binaryStr.length()-1);
         double sum = 0;
          for(int i =1;i<=mStr.length();i++){
        if(mStr.charAt(i-1)=='1'){
                sum = sum+Math.pow(0.5,i);
                       }
              }
    double a =( Math.pow(2,n-127))*(1+sum);
        return a;
}

Python代码实现

def transfer(hexStr):
    ret = str();
    for x in range(0,len(hexStr),2):
        a = hexStr[x:x+2];
        intItem = int(a,16);
        binnaryStr = bin(intItem)[2:len(bin(intItem))];
        binnaryStr = "%(binnary)08d"%{'binnary':int(binnaryStr)}
        ret = ret+binnaryStr;
    s= int(ret[0]);
    n = int(ret[1:9],2);
    mStr = ret[9:len(ret)-1];
    m = float();
    print(mStr);
    for x in range(1,len(mStr)-1,1):
        if mStr[x-1] == "1":
            print(x);
            m=m+math.pow(0.5,x);

    val = math.pow(-1,s)*(math.pow(2,n-127))*(1+m);
    print(val)
    return ret;

转载于:https://www.cnblogs.com/bingoj/p/11148305.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值