# 单片机中浮点数取值问题

typedef struct __buf_to_float_

{
int inter_part;
int decimal;
int sig;
}float_data;

char bufx[4] = {0x43,0x6a,0x00,0x00};
float_data buf_to_Float_get(char *bufx)
{
int FloatValue = 0;
float_data ret;
int Exp;
int FloatPath;
int MantissaPart;
ret.sig = 1;
FloatValue |= bufx[0]<<24;
FloatValue |= bufx[1]<<16;
FloatValue |= bufx[2]<<8;
FloatValue |= bufx[3];

if(FloatValue&0x80000000)  //最高位为符号位
{
ret.sig = -1;
}
Exp = (FloatValue>>23)&0xff; //取得指数字段，一个字节。第二到第9字节
MantissaPart=(FloatValue&0x7fffff)|0x800000;//尾数字段，23位加一个默认位，共24位。
ret.inter_part = (MantissaPart>>(150-Exp));

FloatPath = MantissaPart&(0xffffff>>(Exp-126));//取得小数部分
ret.decimal = FloatPath/float(1<<(150-Exp));
return ret;

}

int main(void)

{

float_data ret;

ret = buf_to_Float_get(bufx);

printf("\n符号：=%d 整数部分 =%d,小数部分=%d\n",ret.sig,ret.inter_part,ret.decimal);

return 0;

}

//

#include<stdio.h>
#define BitSet(Number,pos) ((Number) &= ~(1<<(pos)))
#define BitGet(Number,pos) ((Number) >> (pos)&1)

typedef struct float_data_struct
{
int sig;
int inter_part;
int decimal;
}float_data;

#define FLOAT_VALUE 10000000
float_data float_binary_to_struct(char *bufx)
{
int i;
int exp;
int exp_sig;
int inter = 0;
int descimal;
int descimal_data;
int data = 0;
int flag;
float_data ret;
unsigned int FloatValue = 0;
FloatValue |= ((bufx[0]<<24)&0xff000000);
FloatValue |= ((bufx[1]<<16) & 0xff0000);
FloatValue |= ((bufx[2]<<8) & 0xff00);
FloatValue |= (bufx[3] & 0xff);
exp = ((((FloatValue & 0x7f800000)>>23)&0xff)-127);
if(exp < 0)
{
exp_sig = -1;
}
else
{
exp_sig = 1;
}
if(FloatValue&(1<<31))
{
ret.sig = -1;
}
else
{
ret.sig = 0;
}
descimal = ((FloatValue & 0x7fffff));
descimal_data = 0;
for(i=0; i<23;i++)
{
if(BitGet(descimal, 22-i))
{
data = (FLOAT_VALUE / (1<<(i+1)));
}
else
{
data = 0;
}
descimal_data += data;
}
descimal_data +=(FLOAT_VALUE);
if(exp > 0)
{
descimal_data =descimal_data*(1<<exp);
}
else
{
exp *= (-1);
descimal_data =descimal_data/(1<<exp);
}
ret.decimal = (descimal_data%FLOAT_VALUE)/(FLOAT_VALUE/1000);
flag = ret.decimal%10;
if(flag >=5 )//此处进行了四舍五入
{
ret.decimal=(ret.decimal/10+1);
}
else
{
ret.decimal=(ret.decimal/10);
}
ret.inter_part = descimal_data/FLOAT_VALUE;
return ret;
}

void main(void)
{
//char buf[4]={0x40,0x88,0x2d,0xe0};//3FA00000
//char buf[4]={0xe0,0x2d,0x88,0x40};
//char buf[4]={0x42,0xc9,0x22,0xb6};//3FA00000'
//char buf[4]={0xBE,0x23,0xD7,0x0A};//BE23D70A'   -0.16
//char buf[4]={0xBD,0x75,0xC2,0x88};//BD75C288'   -0.06
//char buf[4]={0xC1,0x80,0x7A,0xE1};//C1807AE1     -16.06
//char buf[4]={0,0,0,0};//000000000     0
//char buf[4]={0x3F,0x93,0x33,0x33};//3F933333  1.15
//char buf[4]={0x3E,0x57,0x0A,0x3C};//3E570A3C  0.21
//char buf[4]={0x41,0x43,0x5c,0x28};//41435C28 12.21
char buf[4]={0x42,0xCC,0x0F,0x5C};//42CC0F5C  102.03
float_data ret;
ret = float_binary_to_struct(buf);
printf("sig:%d, decimal:%d,inter:%d\n", ret.sig, ret.decimal, ret.inter_part);
return ;
}

04-20

04-27
08-11
04-15 3332
06-12 3984
07-05 3585
01-21 556