Скажем, у меня есть число с плавающей точкой в диапазоне [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
усекает число с плавающей запятой.
РЕДАКТИРОВАТЬ: Так как у нас была некоторая путаница здесь: мне нужно отображение, которое отображает наименьшее входное значение с плавающей запятой (0) на наименьший беззнаковый символ, и наибольшее значение с плавающей точкой в моем диапазоне (1,0f) старший байт без знака (255).