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

时间:2012-02-14 09:23:41

标签: c floating-point encode floating-point-precision memory-optimization

我正在创建一个(大)浮点数组,每个浮点数需要4个字节。

有没有办法,假设我的浮点数范围介于0到255之间,将每个浮点数存储在 > 4个字节以内?

我可以对整个阵列进行任何计算。

我正在使用C.

3 个答案:

答案 0 :(得分:1)

您需要多少精度?

您可以将每个浮点数存储为2个字节,方法是将其表示为unsigned short(范围从0到65,535),并在需要实际值时将所有值除以2^8。这与使用定点格式而不是浮点基本相同。

但是,当你这样做时,你的精确度仅限于1.0 / (2^8) = 0.00390625

答案 1 :(得分:1)

您的数据的绝对范围并不重要,它是您需要的精确度。如果你能逃脱,例如精度为6位数,那么您只需要存储1-1000000整数所需的存储空间,即20位。所以,假设这一点,你可以做的是:

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

2)将数据缩放(乘以)一个足够大的数字,以便在截断为整数后,您将不会失去任何所需的精度。

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

4)现在,'解密'。解压缩值(已保存每个值的#位数),取消缩放和取消移位。

所以,这将会做到这一点,并且可能比标准压缩算法更快,更紧凑,因为它们不允许对你需要多少精度做出假设,但你是。

答案 2 :(得分:0)

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

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