将存储为unsigned long的固定点数转换为float

时间:2014-04-05 21:50:48

标签: c fixed long-integer

我从q16.4格式的传感器读取有符号小数值,并通过i2c总线接收该值作为无符号长整数。我想将此值转换为float以执行算法。我试图将它转换为像这样浮动:

float vOut = (float)read_data * 65536;

没有结果。数据看起来仍然是unsigned long。你能否给出我的建议,正确转换它的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

尝试:

float vOut = read_data;
vOut /= 16.0f;

除以16会将固定点数的四个小数位推入浮点数的小数位。

答案 1 :(得分:1)

对不起,没有更详细的GTG。

uint8_t tab[3];
Read_sensor(tab);
unsigned long ul = tab[0];
ul <<= 8; 
ul |= tab[1];
ul <<= 4; 
ul |= tab[2] & 0xF;

// I am fuzzy on q16.4  format, so some assumptions.
// Assuming Bit 19 is the sign bit and data is sign-magnitude
float x = ul & 0x7FFFFL;
x /= 16.0f;
if (ul & 0x80000L) {
  x = -x;
}