当前位置:  开发笔记 > 编程语言 > 正文

将浮点范围转换/量化为整数范围

如何解决《将浮点范围转换/量化为整数范围》经验,为你挑选了1个好方法。

假设我在[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的人:只是假设,floatint转换截断浮动.

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



1> Jon Skeet..:

如何a * 256f用支票减少256到255?所以类似于:

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

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

基本上你想要将范围分成256个相等的部分,这应该是应该做的.1.0的边缘情况变为256并且需要向下舍入仅仅是因为域的两端都是包含的.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有