c floating-point constants magic-numbers

¿Qué representa la constante 0.0039215689?



floating-point constants (2)

Esta multiplicación por 0.0039215689f convierte una intensidad de color de valor entero en el rango de 0 a 255 en una intensidad de color de valor real en el rango de 0 a 1.

Como señala Ilmari Karonen, incluso si se trata de una optimización, se expresa bastante mal. Sería mucho más claro multiplicar por (1.0f/255) .

Sigo viendo este constante emergente en varios archivos de encabezado de gráficos

0.0039215689

Parece tener algo que ver con el color tal vez?

Aquí está el primer éxito en 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

¿Qué representa este número? ¿Por qué nadie parece declararlo como una const?

No pude encontrar nada en Google que lo explicara.


0.0039215689 es aproximadamente igual a 1/255 .

Al ver que esto es OpenGL, el rendimiento es probablemente importante. Entonces, probablemente sea seguro suponer que esto se hizo por razones de rendimiento.

Multiplicar por el recíproco es más rápido que dividir repetidamente por 255.

Nota al margen:

Si se pregunta por qué una microoptimización de este tipo no se deja al compilador, es porque es una optimización de punto flotante insegura. En otras palabras:

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

Debido a errores de redondeo de punto flotante.

Por lo tanto, si bien los compiladores modernos pueden ser lo suficientemente inteligentes para realizar esta optimización, no se les permite hacerlo a menos que usted les indique explícitamente que lo hagan a través de una marca de compilación.

Relacionado: ¿Por qué GCC no optimiza a * a * a * a * a * a * (a * a * a) * (a * a * a)?