Я постоянно вижу эту константу, всплывающую в различных графических заголовочных файлах
0.0039215689
Кажется, это как-то связано с цветом?
Вот первый хит в Google :
void RDP_G_SETFOGCOLOR(void)
{
Gfx.FogColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f;
Gfx.FogColor.G = _SHIFTR(w1, 16, 8) * 0.0039215689f;
Gfx.FogColor.B = _SHIFTR(w1, 8, 8) * 0.0039215689f;
Gfx.FogColor.A = _SHIFTR(w1, 0, 8) * 0.0039215689f;
}
void RDP_G_SETBLENDCOLOR(void)
{
Gfx.BlendColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f;
Gfx.BlendColor.G = _SHIFTR(w1, 16, 8) * 0.0039215689f;
Gfx.BlendColor.B = _SHIFTR(w1, 8, 8) * 0.0039215689f;
Gfx.BlendColor.A = _SHIFTR(w1, 0, 8) * 0.0039215689f;
if(OpenGL.Ext_FragmentProgram && (System.Options & BRDP_COMBINER)) {
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 2, Gfx.BlendColor.R, Gfx.BlendColor.G, Gfx.BlendColor.B, Gfx.BlendColor.A);
}
}
//...more like this
Что означает это число? Почему никто, кажется, не объявляет это как const?
Я не смог найти в Google ничего, что могло бы это объяснить.
c
floating-point
constants
magic-numbers
раздавить
источник
источник
(1.f/255)
?1/255 == 0.00(3921568627450980)
- Парены означают повторение.Ответы:
0.0039215689
примерно равно1/255
.Видя, что это OpenGL, производительность, вероятно, важна. Так что, вероятно, можно догадаться, что это было сделано из соображений производительности.
Умножение на обратное происходит быстрее, чем повторное деление на 255.
Примечание:
Если вам интересно, почему такая микрооптимизация не оставлена на усмотрение компилятора, это потому, что это небезопасная оптимизация с плавающей запятой. Другими словами:
из-за ошибок округления с плавающей точкой.
Таким образом, хотя современные компиляторы могут быть достаточно умны, чтобы выполнить эту оптимизацию, им не разрешается делать это, если вы явно не скажете им об этом с помощью флага компилятора.
Связанный: Почему GCC не оптимизирует a * a * a * a * a * a к (a * a * a) * (a * a * a)?
источник
a = b * (1.0f / 255)
; компиляторы все еще делают постоянное свертывание, не так ли?0.0 - 0.996
вместо желаемого0.0 - 1.0
. (0.996 = 255/256
где255
наибольшее 8-разрядное целое число)Это умножение на
0.0039215689f
преобразует целочисленную интенсивность цвета в диапазоне от 0 до 255 в реальную интенсивность цвета в диапазоне от 0 до 1.Как указывает Илмари Каронен, даже если это оптимизация, она довольно плохо выражена. Было бы намного яснее умножить на
(1.0f/255)
.источник