Saya terus melihat ini muncul dalam berbagai file header grafis
0.0039215689
Sepertinya ada hubungannya dengan warna mungkin?
Inilah hit pertama di 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
Apa yang angka ini wakili? Mengapa tidak ada orang yang menyatakannya sebagai const?
Saya tidak dapat menemukan apa pun di Google yang menjelaskannya.
c
floating-point
constants
magic-numbers
menghancurkan
sumber
sumber
(1.f/255)
?1/255 == 0.00(3921568627450980)
- parens berarti pengulangan.Jawaban:
0.0039215689
kira-kira sama dengan1/255
.Melihat bahwa ini adalah OpenGL, kinerja mungkin penting. Jadi mungkin aman untuk menebak bahwa ini dilakukan karena alasan kinerja.
Mengalikan dengan timbal balik lebih cepat daripada berulang kali membagi dengan 255.
Catatan samping:
Jika Anda bertanya-tanya mengapa optimasi mikro seperti itu tidak diserahkan kepada kompiler, itu karena itu adalah optimasi floating-point yang tidak aman. Dengan kata lain:
karena kesalahan pembulatan floating-point.
Jadi, walaupun kompiler modern mungkin cukup pintar untuk melakukan optimasi ini, mereka tidak diperbolehkan melakukannya kecuali Anda secara eksplisit menyuruh mereka melalui flag kompiler.
Terkait: Mengapa GCC tidak mengoptimalkan a * a * a * a * a * a ke (a * a * a) * (a * a * a)?
sumber
a = b * (1.0f / 255)
; kompiler masih melakukan pelipatan konstan, bukan?0.0 - 0.996
yang diinginkan0.0 - 1.0
. (0.996 = 255/256
mana255
bilangan bulat 8-bit terbesar)Penggandaan ini dengan
0.0039215689f
mengubah intensitas warna bernilai integer dalam kisaran 0 hingga 255 ke intensitas warna bernilai nyata dalam kisaran 0 hingga 1.Seperti yang Ilmari Karonen tunjukkan, bahkan jika ini adalah optimasi, itu adalah ekspresi yang agak buruk. Akan jauh lebih jelas untuk dikalikan dengan
(1.0f/255)
.sumber