Что представляет собой константа 0,0039215689?

299

Я продолжаю видеть, что эта константа появляется в разных файлах графических заголовков

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, который объяснил это.

  • 0
    Примечание. Компоненты цвета (например, красный, зеленый, синий, альфа) часто представлены как целое число в [0; 255] во многих API
  • 16
    Есть ли какая-то причина, по которой исходный код написал бы это вместо (1.f/255) ?
Показать ещё 12 комментариев
Теги:
floating-point
constants
magic-numbers

2 ответа

387
Лучший ответ

0.0039215689 приблизительно равно 1/255.

Увидев, что это OpenGL, производительность, вероятно, важна. Поэтому, вероятно, можно с уверенностью предположить, что это было сделано по соображениям производительности.

Умножение на обратное происходит быстрее, чем повторное деление на 255.


Боковое примечание:

Если вам интересно, почему такая микро-оптимизация не оставлена ​​компилятору, это потому, что это небезопасная оптимизация с плавающей запятой. Другими словами:

x / 255  !=  x * (1. / 255)

из-за ошибок округления с плавающей запятой.

Таким образом, хотя современные компиляторы могут быть достаточно умными для этой оптимизации, им не разрешается делать это, если вы явно не указали им через флаг компилятора.

Связано: Почему GCC не оптимизирует a * a * a * a * a * a (a * a * a) * (a * а * а)?

  • 1
    Вот это да. Все, что я могу сказать, это отличный ответ. Я, вероятно, никогда бы не открыл это без вашего ведома. Конечно, теперь, зная, что это представляет, это кажется совершенно очевидным!
  • 10
    Я на самом деле не знал, что это было, когда я впервые увидел это. Но, видя, как он использовался, я подозревал, что это была оптимизация, умноженная на взаимность. Так что я проверил свой калькулятор и, конечно же, я догадался.
Показать ещё 18 комментариев
73

Это умножение на 0.0039215689f преобразует интенсивность цвета с целым числом в диапазоне от 0 до 255 до реальной значащей интенсивности цвета в диапазоне от 0 до 1.

Как указывает Илмари Каронен, даже если это оптимизация, это довольно плохо выраженная. Было бы гораздо яснее размножаться на (1.0f/255).

  • 5
    Или, может быть, лучше, определяется как постоянная?
  • 9
    @Johny Определено как константа. Дело не в волшебной ценности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню