假设我在[0,1]范围内有一个浮点数,我想量化并将其存储在无符号字节中.听起来很简单,但事实上它很复杂:
显而易见的解决方案如下:
unsigned char QuantizeFloat(float a) { return (unsigned char)(a * 255.0f); }
这种方法到目前为止我得到的所有数字都是0到255,但整数的分布并不均匀.该函数仅255
在a完全正确时才返回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).
如何a * 256f
用支票减少256到255?所以类似于:
return (unsigned char) (min(255, (int) (a * 256f)));
(对于你平台上合适的min函数 - 我不记得它的C函数.)
基本上你想要将范围分成256个相等的部分,这应该是应该做的.1.0的边缘情况变为256并且需要向下舍入仅仅是因为域的两端都是包含的.