用整数表示浮点数

Represent float using integer

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 个数据包,因为同时获取整个数据非常重要。

我打算改为利用该范围。

知道这些信息后,我如何最多使用 20 个字节来序列化数据?

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

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

这个 make make 为 2*10 + 6*(32-4) = 188 位,仍然没有下降到 160。

OP 表示 "The precision of floats can not be sacrificed" 暗示需要 24 位(明确编码的 23 位)有效数字。 7 float * 23 位是 161 位,这不包括符号、指数和 2 uint16_t.

所以除非一些模式或冗余信息可以被消除,否则OP是不走运的。


建议对 data 进行多次采样并尝试使用 LZ or other compression techniques. If OP ends up with significantly less than 20 bytes per averagedata, then the answer is yes - in theory, else you are SOL 进行压缩。