Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用整数表示浮点_C_Sizeof_Systems Programming - Fatal编程技术网

C 使用整数表示浮点

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字节。不能牺牲浮标的精度,因为浮标表示加速度计和四元数,如果不能精确表示,将产生巨大的漂移误差(数据将随时间积分) 我也不想发送两个数据包

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

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位
知道这些信息后,如何最多使用20个字节对数据进行序列化?

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

一些节省:
1) 10位
uint16\u t

2) 减小的指数范围可为每个
浮点节省1位或2位
——如果OP也规定了_最小指数,则可多节省几位。(估计总共4位)
3) 不编码
w

这使得2*10+6*(32-4)=188位,仍然没有下降到160位

OP表示“不能牺牲浮点精度”,这意味着需要24位(23位显式编码)有效位。7
float
*23位为161位,不计算符号、指数或2
uint16\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