假设我在[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人:只需假设float
到int
转换会截断浮动。
编辑:由于我们在这里有些困惑:我需要一个映射,将最小的输入float(0)映射到最小的unsigned char,并将我的范围的最高浮点数(1.0f)映射到最高无符号字节(255)。
答案 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。