转换/量化浮动范围整数范围
-
11-09-2019 - |
题
说我有在[0,1]的范围内的浮子和欲量化并将其存储在一个无符号字节。听起来像一个没有脑子,但实际上它是相当复杂的:
显而易见的解决方案是这样的:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f);
}
这工作在到目前为止,我得到的所有号码从0到255,但整数的分布并不均匀。该功能仅当是完全255
返回1.0f
。不是一个很好的解决方案。
如果我做适当的四舍五入我刚转移问题:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f + 0.5f);
}
下面的结果0
仅覆盖浮子的范围比任何其他数量的一半。
如何做的浮点范围的均等分布的量化?理想我想获得整数的相等分布,如果我量化均匀分布随机浮点数。
任何想法?
顺便说一下:另我的代码是在C中的问题是与语言无关的。对于非C人:只是假设float
到int
转换截断浮
修改强>由于我们在这有些混乱:我需要的映射映射的最小输入浮子(0)到最小的无符号字符,以及我的范围(1.0F)的浮子最高到最高无符号字节(255)。
解决方案
如何用支票a * 256f
减少256到255?所以是这样的:
return (unsigned char) (min(255, (int) (a * 256f)));
(用平台上的合适的min函数 - 我不能记住它的C函数)
基本上要的范围分成256个等分,这是什么,应该做的。边缘的情况下为1.0去256和需要向下取整是,只是因为该域是包容在两端。
其他提示
我想你正在寻找的是:
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。
不隶属于 StackOverflow