C 存储固定范围浮动的有效方法

C 存储固定范围浮动的有效方法,c,floating-point,encode,floating-point-precision,memory-optimization,C,Floating Point,Encode,Floating Point Precision,Memory Optimization,我正在抛出一个(大)浮点数数组,每个浮点数需要4个字节 考虑到我的浮点值范围在0到255之间,有没有办法将每个浮点值存储在小于4字节的范围内 我可以对整个数组进行任意数量的计算 我用的是C.你需要多少精度 通过将每个浮点值表示为无符号短(范围从0到65535),并在需要实际值时将所有值除以2^8,可以将每个浮点值存储在2个字节中。这与使用定点格式而不是浮点格式基本相同 但是,执行此操作时,精度限制为1.0/(2^8)=0.00390625。例如,您可以在一个字节上存储整数(带.0的浮点),但另一

我正在抛出一个(大)浮点数数组,每个浮点数需要4个字节

考虑到我的浮点值范围在0到255之间,有没有办法将每个浮点值存储在小于4字节的范围内

我可以对整个数组进行任意数量的计算


我用的是C.

你需要多少精度

通过将每个浮点值表示为
无符号短
(范围从0到65535),并在需要实际值时将所有值除以
2^8
,可以将每个浮点值存储在2个字节中。这与使用定点格式而不是浮点格式基本相同


但是,执行此操作时,精度限制为
1.0/(2^8)=0.00390625

例如,您可以在一个字节上存储整数(带.0的浮点),但另一个浮点需要更多字节


如果您不担心精度,也可以使用定点…

数据的绝对范围实际上并不重要,而是您需要的精度。如果您可以获得6位数的精度,那么您只需要存储1-1000000之间的整数所需的存储量,即20位。所以,假设这样,你能做的是:

1) 移动数据,使最小元素的值为0。即从每个元素中减去一个值。记录下这个班次

2) 用一个足够大的数字缩放(乘以)数据,这样在截断为整数后,就不会丢失所需的任何精度

3) 现在这可能很棘手,除非您可以将数据打包成方便的8位或16位单位——将数据打包成连续的无符号整数。在本例中,每个数据值都需要20位,因此值1占用整数1的前20位,值2占用整数1的剩余12位和整数2的前8位,依此类推。在这种假设情况下,您最终可以节省约40%

4) 现在,“解密”。解压值(您已在每个值中保存了#个位)、取消缩放和取消移位


因此,这可以做到,而且可能比标准压缩算法更快、更紧凑,因为它们不允许假设您需要多少精度,但您确实需要。

我不确定精度;我试试这个方法,看看是否有效。不管怎样,谢谢你的想法——如果我想要更高的精度,我可以使用3个字节,但是我会有一些对齐问题。也许有一个不损失精度的解决方案。作为旁注,这对于均匀分布是完美的。如果值趋向于0左右,需要更高的精度,则可以使用或自定义3位浮点作为指数。谢谢。看起来主要的想法是先计算出精度。是的,我想这就是它的开始和结束。在此之后,请确保对无符号整数执行任何“位压缩”,否则符号位可能会使事情变得不必要的复杂。另外,由于您的绝对范围是有限的,我认为通过这种技术,您可以保证在不损失任何精度的情况下至少节省一些成本。