说我有在[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人:只是假设floatint转换截断浮

修改由于我们在这有些混乱:我需要的映射映射的最小输入浮子(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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top