常数0.0039215689代表什么?


309

我不断在各种图形头文件中看到此常数

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上找不到任何可以解释的内容。


16
源代码是否有任何理由代替它(1.f/255)
MM

53
嗯...如果只有某种方法可以避免幻数......
Paul Draper 2014年

12
1/255 == 0.00(3921568627450980)-请原谅平均重复。
jfs 2014年

82
使用您的下一个魔幻数字,尝试询问Wolfram Alpha
AakashM 2014年

12
无论出于何种原因,在没有证明其目的的情况下使用幻数是非常不明智的
Isaac Rabinovitch 2014年

Answers:


378

0.0039215689大约等于1/255

看到这是OpenGL,性能可能很重要。因此,可以安全地猜测这样做是出于性能原因。

乘以倒数比重复除以255更快。


边注:

如果您想知道为什么这种微优化没有留给编译器,那是因为它是不安全的浮点优化。换一种说法:

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

由于浮点舍入错误。

因此,尽管现代的编译器可能足够聪明地执行此优化,但是除非您通过编译器标志明确告知它们这样做,否则不允许这样做。

相关: 为什么GCC不能将a * a * a * a * a * a优化为(a * a * a)*(a * a * a)?


10
当我第一次看到它时,我实际上不知道那是什么。但是看到它的使用方式后,我怀疑这是乘以倒数的优化。因此,我检查了计算器,并确定了-我猜对了。
Mysticial

55
我本来希望看到它写成a = b * (1.0f / 255); 编译器仍会不断折叠,不是吗?
Ilmari Karonen 2014年

9
@IlmariKaronen是的,他们仍然会不断折叠。实际上,某些东西是必需的,例如模板分辨率等。但是我只是将其作为常量或宏提取出来。但是,并非所有代码都是完美编写的。:)
Mysticial

5
@hippietrail最初,我想知道同样的事情。但是如果你使用256,它会从规模0.0 - 0.996,而不是所期望的0.0 - 1.0。(0.996 = 255/256其中255最大的8位整数是)
Mysticial

7
当然,要回答我自己的问题,是因为其他两个数字不能表示为标准C浮点数。下一个低于0.0039215689的浮点为0.0039215684。
Daniel Waechter 2014年

79

此乘法0.0039215689f将0到255范围内的整数值颜色强度转换为0到1范围内的实数颜色强度。

正如Ilmari Karonen指出的那样,即使这是一项优化,它也是一个表达得很差的方法。乘以将更加清晰(1.0f/255)


5
也许更好,定义为常量?
约翰尼(Johny)2014年

9
@Johny当然定义为常量。关键不是魔术值。
David Heffernan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.