О да. Еще в hacker's delight (или где? не помню) было про то, что "при перемножении цветов помните, что перемножение белых цветов должно оставлять их белыми, и еще перемножение не должно искажать гамму, ибо потом замаетесь дебажить порядок перемножений"
>при перемножении цветов помните, что перемножение белых цветов должно оставлять их белыми Ага. Тогда b2f_1, который (b+0.5) / 256 в пролёте. Если им перевести 1.0 в (1 - 511/512) и возвести в большую степень то белый станет черным.
>и еще перемножение не должно искажать гамму, ибо потом замаетесь дебажить порядок перемножений А как это надо понимать, "сохранить гамму при перемножении"? Которая вообще не известна для абстрактной картинки в вакууме (там гамма подогнана под любимый монитор дизайнера или номинальные 2.2 и испорчена тысячей мониторов пользователей). И почему порядок вдруг становится важен?
А потому, что какой-то мудак при разработке C решил, что приведение float/double к int - это круто, причём округление должно делаться к меньшему по модулю (это вообще неиллюзорный пиздец и источник ошибок).
В Паскале, например, отродясь были функции round и trunc, а использование real вместо integer недопустимо. И я считаю, это правильно.
И чуть ли не первым делом в любой проге, где есть такие приведения, втыкаю inline int round(double) - ну или подключаю хедер.
да-да-да! еще порой очень хочется иметь возможность описывать пользовательские типы и их трансформации. как в f# measure units. с ними писать на целочисленной арифметике очень удобно.
Comments 34
Reply
Ага. Тогда b2f_1, который (b+0.5) / 256 в пролёте. Если им перевести 1.0 в (1 - 511/512) и возвести в большую степень то белый станет черным.
>и еще перемножение не должно искажать гамму, ибо потом замаетесь дебажить порядок перемножений
А как это надо понимать, "сохранить гамму при перемножении"? Которая вообще не известна для абстрактной картинки в вакууме (там гамма подогнана под любимый монитор дизайнера или номинальные 2.2 и испорчена тысячей мониторов пользователей).
И почему порядок вдруг становится важен?
Reply
Ну, э, операция некоммутативной становится, ибо нелинейно)
Reply
Не смог расшифровать обозначения и смысл :(
Reply
Reply
Reply
В Паскале, например, отродясь были функции round и trunc, а использование real вместо integer недопустимо. И я считаю, это правильно.
И чуть ли не первым делом в любой проге, где есть такие приведения, втыкаю inline int round(double) - ну или подключаю хедер.
Reply
Reply
Reply
#include
int main()
{
int i = 100000005;
float f = i;
int j = f;
std::cout << j << '\n'; //suddenly, output 100000008
}
Reply
Хм, вот попытался представить себе ситуацию - не смог. Можно примеры необходимости такой экономии?
Reply
Reply
Альфа-канал (прозрачность), опять же.
Reply
Reply
Reply
А где ещё?
Reply
Reply
Leave a comment