c - 常数0.0039215689代表什么?

标签 c floating-point constants magic-numbers

我一直在各种图形头文件中看到这个常量弹出

0.0039215689

好像跟颜色有关系?

这是第一个hit on 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

这个数字代表什么?为什么似乎没有人将其声明为常量?

我在 Google 上找不到任何解释。

最佳答案

0.0039215689 约等于 1/255

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

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


旁注:

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

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

由于浮点舍入错误。

因此,尽管现代编译器可能足够聪明来进行此优化,但除非您通过编译器标志明确告诉他们这样做,否则不允许他们这样做。

相关: Why doesn't GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)?

关于c - 常数0.0039215689代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22621241/

相关文章:

c - 结构体指针和指针char数组malloc数组

c - 一个简单链表的头改变

java - 数学简单例子

c++ - const 模板参数在创建后不保留 const-ness

c++ - 可以通过 const 说明符重载函数吗?

c - 避免过度转换

c - strcpy:在 union 中使用 char** 变量作为参数

c - 将所有结果均为完整整数的十进制数相乘是否被视为 float 学?

random - 接近零的均匀真实分布

constants - 不可变成员函数和常量成员函数有什么区别?