用整数表示浮点数
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 个数据包,因为同时获取整个数据非常重要。
我打算改为利用该范围。
- 加速度计是 [-10, 10]
范围内的 IEEE 浮点数
- 四元数是 [-1, 1] 范围内的 IEEE 浮点数。我们可以删除 w,因为 x^2 + y^2 + z^2 + w^2 = 1
- 顶部和底部各为 10 位。
知道这些信息后,我如何最多使用 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 进行压缩。
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 个数据包,因为同时获取整个数据非常重要。
我打算改为利用该范围。
- 加速度计是 [-10, 10] 范围内的 IEEE 浮点数
- 四元数是 [-1, 1] 范围内的 IEEE 浮点数。我们可以删除 w,因为 x^2 + y^2 + z^2 + w^2 = 1
- 顶部和底部各为 10 位。
知道这些信息后,我如何最多使用 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 进行压缩。