упаковка float 01 <-> byte

Nov 25, 2010 02:54

Часто значения float из промежутка [0, 1] хранят в виде байта или в двух байтах, для экономии места ( Read more... )

math, tips, geom-prog, soft-dev, paint mad skilz

Leave a comment

zeux November 25 2010, 06:06:54 UTC
Странный пост :)
Т.е. нет, все вроде правильно!
За исключением того, что канонически правильный подход такой - encode = int(f * 255 + 0.5), decode = b / 255.

encode делает разные интервалы, ужимая в два раза краевые точки - это как раз никому нахрен не нужно.

А вот и более другой тест: http://www.everfall.com/paste/id.php?z14ea7ntlmj4
Важные качества:
- f2b(b2f(i)) == i
- ошибка от b2f(f2b(i)) минимизируется - это собственно и важно при квантизации!
- влияние шума минимизируется
- endpoints сохраняются (кстати, бывает важно чтобы сохранялись не только endpoints - например, чтобы 0.5 без погрешности кодировалось в 128 - тогда надо брать умножение на 256).

Для пары *255+0.5 и /255 значения такие:
encode/decode error: 1.268933
noise threshold: 0.001961

Для пары *255.999f и /255 значения такие:
encode/decode error: 2.530851
noise threshold: 0.000016

Итого, как по мне - *256 (НЕ *255.9999) если надо сохранить 0.5, и *255+0.5 во ВСЕХ остальных случаях.

YMMV? :)

Reply

_winnie November 25 2010, 08:09:46 UTC
Спасибо, добавил в пост!

Reply


Leave a comment

Up