C 使用整数表示浮点
可扩展数据包的限制大小为20字节。我需要通过它传输以下数据:C 使用整数表示浮点,c,sizeof,systems-programming,C,Sizeof,Systems Programming,可扩展数据包的限制大小为20字节。我需要通过它传输以下数据: struct Data { uint16_t top; uint16_t bottom; float accX; float accY; float accZ; float qx; float qy; float qz; float qw; }; 数据大小为32字节。不能牺牲浮标的精度,因为浮标表示加速度计和四元数,如果不能精确表示,将产生巨大的漂移误差(数据将随时间积分) 我也不想发送两个数据包
struct Data {
uint16_t top;
uint16_t bottom;
float accX;
float accY;
float accZ;
float qx;
float qy;
float qz;
float qw;
};
数据大小为32字节。不能牺牲浮标的精度,因为浮标表示加速度计和四元数,如果不能精确表示,将产生巨大的漂移误差(数据将随时间积分)
我也不想发送两个数据包,因为同时获取整个数据非常重要
我打算利用这个范围
- 加速计是介于[-10,10]范围内的IEEE浮点数
- 四元数是介于[-1,1]范围内的IEEE浮点数。我们可以去掉w,因为x^2+y^2+z^2+w^2=1
- 顶部和底部各为10位
1) 10位
uint16\u t
,2) 减小的指数范围可为每个
浮点节省1位或2位
——如果OP也规定了_最小指数,则可多节省几位。(估计总共4位)3) 不编码
w
这使得2*10+6*(32-4)=188位,仍然没有下降到160位
OP表示“不能牺牲浮点精度”,这意味着需要24位(23位显式编码)有效位。7float
*23位为161位,不计算符号、指数或2uint16\t
因此,除非能够消除某些模式或冗余信息,否则OP就不走运了
建议采集大量
数据样本
,并尝试使用压缩或其他压缩技术对其进行压缩。如果OP的平均值远小于20字节,那么答案是肯定的——理论上是肯定的,否则就是肯定的。嗯,如果你不能牺牲精度,那么你就不能使用uint16\u t
来表示浮点值,即使你限制了范围float
s小数值只需在小数点后而不是小数点前使用额外的位来表示精度。32位的浮点
插入16位的uint16_t
时不能不损失一些精度。考虑到ieee754单精度浮点中大约一半的可能指数表示小于1.0f的值
,对间隔[-10,10]的限制
每个浮点值最多只能节省一位。除非有额外的隐式信息(如某些值之间的固定关系),否则您需要牺牲精度。top
和bottom
的范围是多少?您还可以解相关加速度并存储,例如,一个全精度幅值和两个低精度角度。使用2个字节,我应该能够表示[-10,10]范围内的所有IEEE浮点数?
1e-38如何?最后,它取决于格式和指数范围。使用半浮点数的5位指数,只能降到2^-14