web-dev-qa-db-ja.com

定数0.0039215689は何を表していますか?

さまざまなグラフィックヘッダーファイルにこの定数がポップアップ表示されます

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でそれを説明するものを見つけることができませんでした。

307
crush

0.00392156891/255とほぼ同じです。

これがOpenGLであることを確認すると、おそらくパフォーマンスが重要です。したがって、これがパフォーマンス上の理由で行われたと推測するのはおそらく安全です。

逆数による乗算は、255で繰り返し除算するよりも高速です。


サイドノート:

なぜこのような最適化がコンパイラーに委ねられないのか疑問に思っているのなら、それは安全でない浮動小数点最適化だからです。言い換えると:

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

浮動小数点の丸め誤差が原因です。

そのため、最新のコンパイラーはこの最適化を行うのに十分スマートですが、コンパイラーフラグを介して明示的に指示しない限り、それを行うことはできません。

関連:なぜGCCがa * a * a * a * a * a * aを(a * a * a)*に最適化しないのか(a * a * a)?

376
Mysticial

0.0039215689fによるこの乗算は、0〜255の範囲の整数値の色強度を0〜1の範囲の実数値の色強度に変換します。

Ilmari Karonenが指摘しているように、これは最適化であっても、かなりひどく表現されたものです。 (1.0f/255)で乗算すると、はるかに明確になります。

79
David Heffernan