/* 功 能: 将32位浮点数据转换为10进制
* 输 入:
* 输 出:
* 返 回:
* 修改日期:
* 作 者:
* 备 注:
*/
float ConvertFloatToDecimal(uint32_t data)
{
uint32_t temp = data;
float result = 0.0;
uint8_t part1 = data >> 31; //符号部分
int16_t part2 = ((data>>23) & 0xFF)-127; //指数部分 0-255间的数据
uint32_t part3 = (data & 0x7FFFFF); //尾数部分
uint32_t part4 = (data & 0x7FFFFF) | 0x800000; //尾数部分 - 组合 1.尾数部分
//从低位开始确定0位置,减少幂计算次数
int positon = 0; //从此位开始,字位不为0
for(int i = 0;i < 23;i++)
{
positon = i;
if(((part4 >> i) & 0x1) == 0x1)
{
break;
}
}
for(int i = 23;i >= positon;i--)
{
int p1 = (part4>>i) & 0x1;
double p2 = pow(2,part2 + i - 23);
result += p1 * p2;
}
return part1==0 ? result : -result;
}
//
上面转换实际计算需要1.3ms(取决于芯片频率,以及传参)
下面取代pow计算,单次计算在0.1ms内。
const double PowerPositiveValue[25] =
{
1, 2, 4, 8, 16, // 0 1 2 3 4
32, 64, 128, 256, 512, // 5 6 7 8 9
1024, 2048, 4096, 8192, 16384, // 10 11 12 13 14
32768, 65536, 131072, 262144, 524288, // 15 16 17 18 19
1048576, 2097152, 4194304, 8388608, 16777216 // 20 21 22 23 24
};
const double PowerNegativeValue[26] =
{
1, 0.5, 0.25, 0.125, 0.0625, // 0 -1 -2 -3 -4
0.03125, 0.015625, 0.0078125, 0.00390625, 0.001953125, // -5 -6 -7 -8 -9
0.0009765625, 0.00048828125, 0.000244140625, 0.0001220703125, 0.00006103515625, // -10 -11 -12 -13 -14
0.000030517578125, 0.0000152587890625, 0.00000762939453125, 0.000003814697265625, 0.0000019073486328125, // -15 -16 -17 -18 -19
0.00000095367431640625, // -20
0.000000476837158203125, // -21
0.0000002384185791015625, // -22
0.00000011920928955078125, // -23
0.000000059604644775390625, // -24
0.0000000298023223876953125 // -25
};
/* 功 能: IEEE754 将32位浮点数据转换为10进制
* 输 入:
* 输 出:
* 返 回:
* 修改日期: 2024-4-13
* 作 者:
* 备 注: 避免使用pow,加快计算速度
*/
float ConvertFloatToDecimal(const uint32_t data)
{
float result = 0.0;
uint8_t part1 = data >> 31; //符号部分
int16_t part2 = ((data>>23) & 0xFF)-127; //指数部分 0-255间的数据
uint32_t part3 = (data & 0x7FFFFF); //尾数部分
uint32_t part4 = (data & 0x7FFFFF) | 0x800000; //尾数部分 - 组合 1.尾数部分
for(int i = 0;i < 24;i++)
{
int p1 = (part4>>(23-i)) & 0x1;
if(p1 == 0) //因数为0,乘积为0,不参与本次计算
continue;
int power = part2 - i; //计算幂指数
double p2 = 0.0;
if(power >=0 && power < 25) //查正值表
p2 = PowerPositiveValue[power];
else if(power <=0 && power > -26) //查负值表
p2 = PowerNegativeValue[-power];
else //表外数据,计算,不影响结果的,可以直接取零
p2 = 0;//pow(2,part2 - i);
result += p1 * p2;
}
return part1==0 ? result : -result;
}
//
貌似最简单的方法就是利用C语言的联合union来处理,利用底层存储机制读写,速度更快。
typedef union DBType32
{
uint32_t Uword;
int32_t Sword;
float Fword;
};