用整数表示浮点数

时间:2016-08-30 00:20:12

标签: c sizeof systems-programming

BLE数据包的限制大小为20个字节。我需要通过它传输以下数据:

struct Data {
  uint16_t top;
  uint16_t bottom;
  float accX;
  float accY;
  float accZ;
  float qx;
  float qy;
  float qz;
  float qw;
};

数据大小为32个字节。浮动的精度不能被牺牲,因为它们代表加速度计和四元数,如果没有精确表示,数据会随时间积分,会产生巨大的漂移误差。

我也不想发送2个数据包,因为同时获取整个数据非常重要。

我打算利用这个范围。

  • 加速度计是IEEE浮点数,范围为[-10,10]
  • 四元数是IEEE浮点数,范围为[-1,1]。我们可以删除w,因为x ^ 2 + y ^ 2 + z ^ 2 + w ^ 2 = 1
  • 顶部和底部各10位。

了解此信息,如何使用最多20个字节序列化数据?

1 个答案:

答案 0 :(得分:0)

假设binary32,代码使用2 * 16 + 7 * 32位(256位),OP希望限制为20 * 8位(160)。

节省一些:
1)10位uint16_t
2)减少指数范围每float节省一点或2 - 如果OP也声明_minimum指数,则会节省更多位。 (估计总共4位)
3)不编码w

这使得2 * 10 + 6 *(32-4)= 188位,仍然不会降至160。

OP说“不能牺牲浮点数的精度”,这意味着需要24位(23位明确编码)有效数。 7 float * 23位是161位,不计算符号,指数和2 uint16_t

因此,除非某些模式或冗余信息可以被消除,否则OP就会失败。

建议采用data的许多样本,并尝试使用LZ或其他压缩技术对其进行压缩。如果OP每个平均data的结果明显少于20个字节,那么答案是肯定的 - 理论上,你是SOL