打印
[51单片机]

求教16进制浮点数转换成十进制浮点数

[复制链接]
1896|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 单片机浮点运算的问题吗?

使用特权

评论回复
5
ldy1973|  楼主 | 2015-8-6 16:51 | 只看该作者
自己顶吧。

使用特权

评论回复
6
ayb_ice| | 2015-8-6 17:26 | 只看该作者
ldy1973 发表于 2015-8-6 14:00
是51 单片机浮点运算的问题吗?

开什么玩笑

使用特权

评论回复
7
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;
}

使用特权

评论回复
8
liyihong028| | 2015-8-7 09:58 | 只看该作者
楼上的是非常正确的

使用特权

评论回复
9
xxxlzjxxx| | 2015-8-7 10:06 | 只看该作者
就是7楼这样的。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

25

帖子

0

粉丝