Ich sehe diese Konstante immer wieder in verschiedenen Grafik-Header-Dateien
0.0039215689
Es scheint vielleicht etwas mit Farbe zu tun zu haben?
Hier ist der erste Treffer bei 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
Was bedeutet diese Nummer? Warum scheint es niemand als Konstante zu deklarieren?
Ich konnte bei Google nichts finden, was das erklärt hätte.
c
floating-point
constants
magic-numbers
zerquetschen
quelle
quelle
(1.f/255)
?1/255 == 0.00(3921568627450980)
- Parens bedeuten Wiederholung.Antworten:
0.0039215689
ist ungefähr gleich1/255
.Da dies OpenGL ist, ist die Leistung wahrscheinlich wichtig. Es ist also wahrscheinlich sicher zu erraten, dass dies aus Leistungsgründen geschehen ist.
Das Multiplizieren mit dem Kehrwert ist schneller als das wiederholte Teilen durch 255.
Randnotiz:
Wenn Sie sich fragen, warum eine solche Mikrooptimierung nicht dem Compiler überlassen bleibt, liegt dies daran, dass es sich um eine unsichere Gleitkommaoptimierung handelt. Mit anderen Worten:
aufgrund von Gleitkomma-Rundungsfehlern.
Moderne Compiler sind zwar intelligent genug, um diese Optimierung durchzuführen, sie dürfen dies jedoch nur tun, wenn Sie sie ausdrücklich über ein Compiler-Flag dazu auffordern.
Verwandte: Warum optimiert GCC nicht a * a * a * a * a * a bis (a * a * a) * (a * a * a)?
quelle
a = b * (1.0f / 255)
; Compiler falten immer noch ständig, nicht wahr?0.0 - 0.996
stattdessen die gewünschte Skalierung vorgenommen0.0 - 1.0
. (0.996 = 255/256
wo255
ist die größte 8-Bit-Ganzzahl)Diese Multiplikation durch
0.0039215689f
Umwandlung einer ganzzahligen Farbintensität im Bereich von 0 bis 255 in eine realwertige Farbintensität im Bereich von 0 bis 1.Wie Ilmari Karonen betont, ist dies eine ziemlich schlecht zum Ausdruck gebrachte Optimierung. Es wäre so viel klarer, mit zu multiplizieren
(1.0f/255)
.quelle