我正在处理一个(大)浮点数组,每个浮点数需要 4 个字节。
鉴于我的浮点数介于0 和 255 之间,有没有办法将每个浮点数存储在不到4 个字节中?
我可以对整个数组进行任意数量的计算。
我正在使用 C。
我正在处理一个(大)浮点数组,每个浮点数需要 4 个字节。
鉴于我的浮点数介于0 和 255 之间,有没有办法将每个浮点数存储在不到4 个字节中?
我可以对整个数组进行任意数量的计算。
我正在使用 C。
您需要多少精度?
您可以将每个浮点数存储在 2 个字节中,方法是将其表示为unsigned short
(范围从 0 到 65,535)并将所有值除以2^8
您需要的实际值。这本质上与使用定点格式而不是浮点数相同。
但是,您的精确度仅限于1.0 / (2^8) = 0.00390625
执行此操作的时间。
数据的绝对范围并不重要,重要的是您需要的精度。如果您可以避免例如 6 位精度,那么您只需要存储 1-1000000 整数所需的存储空间,即 20 位。所以,假设这个,你可以做的是:
1)移动你的数据,使最小元素的值为0。即从每个元素中减去一个值。记录这个转变。
2)将您的数据缩放(乘以)一个足够大的数字,以便在截断为整数后,您不会失去所需的任何精度。
3) 现在这可能很棘手,除非您可以将数据打包成方便的 8 位或 16 位单元——将数据打包成连续的无符号整数。在此示例中,您的每个数据值都需要 20 位,因此值 1 占用整数 1 的前 20 位,值 2 占用整数 1 的剩余 12 位和整数 2 的前 8 位,依此类推。在这种假设情况下,您最终节省了约 40%。
4) 现在,“解密”。解压这些值(您已经保存了每个值的位数)、取消缩放和取消移位。
因此,这将做到这一点,并且可能比标准压缩算法更快、更紧凑,因为它们不允许对你需要多少精度做出假设,但你是。
例如,您可以在一个字节上存储整数(带有 .0 的浮点数),但另一个浮点数需要更多字节。
如果您不担心精度,也可以使用定点...