单片机中浮点数取值问题

xiaoxiao2021-02-28  74

由于在部分开发编译器中,无法使用float型数据,在单片机中取float型数据的整数部分和小数部分有点麻烦,

在网上看了别的兄弟代码,自己改下了下,测试还可以用。

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;

}

//

下面做一次修改:上面的版本存在问题,不能有float,不是所有的编译器都支持float;

 

 

 

#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;     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 ; }

 

转载请注明原文地址: https://www.6miu.com/read-73046.html

最新回复(0)