Скажем, у меня есть float в диапазоне [0, 1], и я хочу квантовать и хранить его в неподписанном байте. Похоже, никакой опасности, но на самом деле это довольно сложно:Convert/Quantize Float Range to Integer Диапазон
Очевидное решение выглядит следующим образом:
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
конверсия усекает поплавок.
EDIT: Так как мы имели некоторую путаницу здесь: мне нужно отображение, переводящее наименьший входной поплавок (0) до наименьшего неподписанные символ, и самый высокий поплавок моего диапазона (1.0f) до самого высокого знака байта (255).
ничего себе - да, это так! –
Да - (unsigned char) (a * 256.0f) дает вам именно то, что вы хотите для каждого входного значения, кроме 1.0.C не имеет встроенной функции min, поэтому вам придется писать самостоятельно, если вы еще этого не сделали. –
John, я придумал тот же результат, просто не смог перенести его из таблицы Excel. Я удалил свой смущающий ответ. – cdonner