[51单片机] 求教16进制浮点数转换成十进制浮点数

[复制链接]
2475|8
 楼主| ldy1973 发表于 2015-8-6 10:40 | 显示全部楼层 |阅读模式
本帖最后由 ldy1973 于 2015-8-6 14:34 编辑

我在用这个函数做16进制浮点数转换成十进制浮点数时,时对时错。不知原因。求解
byte0低字节
byte3高字节
比如,我输入0xcb  0x24  0x79  0x3f 对应byte0到byte3.正确结果是0.97,但有时是错的,变成0.47。我只取了两位小数。其他舍掉了。实际转换结果是7位小数
float  floattodecimal(uchar byte0,  uchar byte1 , uchar byte2 , uchar byte3)
{
        long int realbyte0 , realbyte1 , realbyte2,realbyte3 ;
        char S ;
        long  int  E , M ;
        float D ;
        realbyte0  = byte3 ;
        realbyte1  = byte2 ;
        realbyte2  = byte1 ;
        realbyte3  = byte0 ;

        if((realbyte0&0x80) == 0)
                S = 0 ;         // 正数
        else
                S = 1 ;         //负数
        E = ((realbyte0<<1) | ((realbyte1&0x80)>>7))-127 ;
        M = ((realbyte1&0x7f)<<16) | (realbyte2<<8) | realbyte3 ;
        D = pow(-1,S)*(1.0+M/pow(2,23))*pow(2,E);
        return   D;
        
}
ayb_ice 发表于 2015-8-6 13:35 | 显示全部楼层
说的不清不楚的,
 楼主| ldy1973 发表于 2015-8-6 13:59 | 显示全部楼层
比如,我输入0xcb  0x24  0x79  0x3f 对应byte0到byte3.正确结果是0.97,但有时是错的,变成0.47。我只取了两位小数。其他舍掉了。实际转换结果是7位小数
 楼主| ldy1973 发表于 2015-8-6 14:00 | 显示全部楼层
是51 单片机浮点运算的问题吗?
 楼主| ldy1973 发表于 2015-8-6 16:51 | 显示全部楼层
自己顶吧。
ayb_ice 发表于 2015-8-6 17:26 | 显示全部楼层
ldy1973 发表于 2015-8-6 14:00
是51 单片机浮点运算的问题吗?

开什么玩笑
ayb_ice 发表于 2015-8-7 08:03 | 显示全部楼层
根本就不需要什么实质转换
typedef union{
        unsigned char u8[4];
        float f32;
}t_F32;

float  floattodecimal(uchar byte0,  uchar byte1 , uchar byte2 , uchar byte3)
{
        t_F32 t;
       
        t.u8[0] = byte3;
        t.u8[1] = byte2;
        t.u8[2] = byte1;
        t.u8[3] = byte0;
       
        return t.f32;
}
liyihong028 发表于 2015-8-7 09:58 | 显示全部楼层
楼上的是非常正确的
xxxlzjxxx 发表于 2015-8-7 10:06 | 显示全部楼层
就是7楼这样的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

25

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部