将浮点范围转换/量化为整数范围

时间:2009-03-01 15:42:53

标签: floating-point integer rounding quantization

假设我在[0,1]范围内有一个浮点数,我想量化并将其存储在无符号字节中。听起来很简单,但事实上它很复杂:

显而易见的解决方案如下:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f);
}

到目前为止,我的所有数字都是0到255,但整数的分布并不均匀。如果a恰好是255,则该函数仅返回1.0f。不是一个好的解决方案。

如果我进行适当的舍入,我只是转移问题:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f + 0.5f);
}

此处结果0仅覆盖浮动范围的一半,而不是任何其他数字。

如何使用相等的浮点范围分布进行量化?理想情况下,如果我量化均匀分布的随机浮点数,我希望获得相等的整数分布。

有什么想法吗?


顺便说一下:我的代码也在C中,问题与语言无关。对于非C人:只需假设floatint转换会截断浮动。

编辑:由于我们在这里有些困惑:我需要一个映射,将最小的输入float(0)映射到最小的unsigned char,并将我的范围的最高浮点数(1.0f)映射到最高无符号字节(255)。

2 个答案:

答案 0 :(得分:11)

如果a * 256f检查减少256到255怎么样?如下所示:

return (unsigned char) (min(255, (int) (a * 256f)));

(对于你平台上合适的min函数 - 我不记得它的C函数。)

基本上你想把范围分成256个相等的部分,这应该是应该做的。 1.0的边缘情况变为256并且需要向下舍入只是因为两端都包含域。

答案 1 :(得分:1)

我认为你在寻找的是:

unsigned char QuantizeFloat (float a)
{
  return (unsigned char) (a * 256.0f);
}

这会将[0,1]中的均匀浮点值映射到[0,255]中的统一字节值。 [i / 256,(i + 1)/ 256 [(不包括(i + 1)/ 256)中的所有值,对于i在0..255中,都映射到i。可能不希望的是1.0f被映射到256.0f,其回绕到0。