浮点数字转成二进制
/********************************************
32位浮点数字转成二进制,
小数点后面的位数,由intNum来决定
************************************************/
uint32_t FloatToBinary(float value)
{
// (-1) s表示符号位,当s = 0,V为正数;当s = 1,V为负数。
// (2)M表示有效数字,大于等于1,小于2。
// (3)2^E表示指数位。
// 对于单精度 符号位 1 指数为8 有效数字 23
uint8_t num=0;
uint32_t reval=0,temp=0;
uint8_t sign =(value>=0)?0:1; //获取符号位
//emberAfCorePrintln("sign:%d",sign);
value= fabs(value); //求绝对值
int Interger = floor(value); //获取整数部分
float frac = value - (float)Interger; //获取小数部分
/************************************************************
正数部分42.75;-42.75
sign:0
Interger:42
frac_h:0x1560
frac_l:0x0000
sign:1
Interger:42
frac_h:0x9560
frac_l:0x0000
********************************************************/
while (Interger)
{
if(Interger % 2)
{
temp |= (1<<num);
}
num++;
Interger /= 2;
}
emberAfCorePrintln("Interger:%d",temp);
temp <<=23;
reval=temp;
/************************************************************
分解小数部分----由于小部分,可能会出现分解不完全的情况,
并且float中仅有23位,所以仅仅循环23次
------但是对于仅有小数的部分,还要截断一部分,所以需要补充
********************************************************/
temp=0;
for(num=0;num<23;num++)
{
frac *=2;
if(frac>=1)
{
frac -=1;
temp |=(1<<(22-num));
}
if(frac==0)
{
break;
}
}
reval |=temp;
//符号位的处理
if(sign)
{
reval |=(1<<31); //负数
}
//emberAfCorePrintln("frac_h:0x%02x",reval>>16);
// emberAfCorePrintln("frac_l:0x%02x",reval&(0xffff));
return 1;
}
浙公网安备 33010602011771号