упаковка 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

Comments 34

wizzard0 November 25 2010, 00:22:46 UTC
О да. Еще в hacker's delight (или где? не помню) было про то, что "при перемножении цветов помните, что перемножение белых цветов должно оставлять их белыми, и еще перемножение не должно искажать гамму, ибо потом замаетесь дебажить порядок перемножений"

Reply

_winnie November 25 2010, 00:37:03 UTC
>при перемножении цветов помните, что перемножение белых цветов должно оставлять их белыми
Ага. Тогда b2f_1, который (b+0.5) / 256 в пролёте. Если им перевести 1.0 в (1 - 511/512) и возвести в большую степень то белый станет черным.

>и еще перемножение не должно искажать гамму, ибо потом замаетесь дебажить порядок перемножений
А как это надо понимать, "сохранить гамму при перемножении"? Которая вообще не известна для абстрактной картинки в вакууме (там гамма подогнана под любимый монитор дизайнера или номинальные 2.2 и испорчена тысячей мониторов пользователей).
И почему порядок вдруг становится важен?

Reply

wizzard0 November 25 2010, 00:38:30 UTC
Это когда края интервалов (0..1 и 254..255) не равны серединке (100..101 например), то градиенты постепенно начинают плыть.

Ну, э, операция некоммутативной становится, ибо нелинейно)

Reply

_winnie November 25 2010, 00:55:35 UTC
>Это когда края интервалов (0..1 и 254..255) не равны серединке (100..101 например)
Не смог расшифровать обозначения и смысл :(

Reply


zeux November 25 2010, 06:06:54 UTC
Странный пост ( ... )

Reply

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

Reply


aamonster November 25 2010, 07:20:10 UTC
А потому, что какой-то мудак при разработке C решил, что приведение float/double к int - это круто, причём округление должно делаться к меньшему по модулю (это вообще неиллюзорный пиздец и источник ошибок).

В Паскале, например, отродясь были функции round и trunc, а использование real вместо integer недопустимо. И я считаю, это правильно.

И чуть ли не первым делом в любой проге, где есть такие приведения, втыкаю inline int round(double) - ну или подключаю хедер.

Reply

_winnie November 25 2010, 08:09:36 UTC
Да, float 2 int и int 2 float оба опасны... Первый опасен гораздо чаще, второй реже но зато непредсказуемей

Reply

aamonster November 25 2010, 08:22:00 UTC
А int 2 float чем опасен? Использованием float вместо double или последующим приведением float 2 int?

Reply

_winnie November 25 2010, 08:26:14 UTC
да, если вместо double - float, или если вместо int - 64bit.

#include

int main()
{
int i = 100000005;
float f = i;
int j = f;

std::cout << j << '\n'; //suddenly, output 100000008
}

Reply


dinozavrik November 25 2010, 09:17:43 UTC
> Часто значения float из промежутка [0, 1] хранят в виде байта или в двух байтах, для экономии места.

Хм, вот попытался представить себе ситуацию - не смог. Можно примеры необходимости такой экономии?

Reply

aamonster November 25 2010, 10:58:56 UTC
Например, карта нормалей (см. bump-mapping)

Reply

aamonster November 25 2010, 10:59:43 UTC
(тут, правда, -1..1 - но принцип тот же).
Альфа-канал (прозрачность), опять же.

Reply


hedin November 25 2010, 09:59:35 UTC
В тех игрушках что я дизайнил, я готов был дорого заплатить, но старался оставить ВСЕ параметры целочисленными :-)

Reply

rageous November 25 2010, 20:29:35 UTC
да-да-да! еще порой очень хочется иметь возможность описывать пользовательские типы и их трансформации. как в f# measure units. с ними писать на целочисленной арифметике очень удобно.

Reply

_winnie November 25 2010, 21:11:43 UTC
Такое может помогать ловить опечатки в физике... и то, по одной очевидной после запуска опечатке в неделю.

А где ещё?

Reply

rageous November 26 2010, 07:08:32 UTC
это помогает читать код, статическая проверка - всего лишь бонус.

Reply


Leave a comment

Up