【问题标题】:Convert/Quantize Float Range to Integer Range将浮点范围转换/量化为整数范围
【发布时间】:2009-03-01 15:42:53
【问题描述】:

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

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

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

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

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

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

这里的结果0 只覆盖了浮动范围的一半,而不是任何其他数字。

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

有什么想法吗?


顺便说一句:我的代码也是 C 语言,问题与语言无关。对于非 C 语言的人:假设 floatint 的转换会截断浮点数。

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

【问题讨论】:

    标签: floating-point integer rounding quantization


    【解决方案1】:

    a * 256f 用支票将 256 减少到 255 怎么样?所以像:

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

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

    基本上,您希望将范围分成 256 个相等的部分,这是应该做的。 1.0 到 256 并且需要向下舍入的边缘情况只是因为域在两端都包含在内。

    【讨论】:

    • Yes -- (unsigned char)(a * 256.0f) 为您提供除了 1.0 之外的每个输入值所需的准确值。 C 没有内置的 min 函数,所以如果你还没有的话,你必须自己编写。
    • 约翰,我得到了相同的结果,只是无法从 Excel 电子表格中正确传输。我删除了我尴尬的答案。
    • 一个令人惊讶的答案,但是是的 - 这似乎是正确的方法。
    • @cdonner:重要的是它将范围划分为 256 等间隔而不是 255。
    • @Jon:是的,我明白了,我确实除以 256,否则我不会看到 1 和 255 的值之间的平均分布。
    【解决方案2】:

    我认为您正在寻找的是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多