1. ホーム
  2. c

[解決済み] [解答】定数0.0039215689は何を表すか?

2022-03-28 04:31:57

質問

様々なグラフィックのヘッダーファイルで、この定型文が表示され続けています。

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で調べても説明されているものが見つからなかった。

どのように解決するのですか?

0.0039215689 とほぼ等しい。 1/255 .

これがOpenGLであることを見ると、パフォーマンスが重要なのでしょう。ですから、これはパフォーマンスのために行われたと推測するのが安全でしょう。

255で何度も割るより、逆数を掛ける方が速いです。


サイドノート

なぜこのような微細な最適化がコンパイラに任されていないのかというと、安全でない浮動小数点最適化であるからです。言い換えれば

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

浮動小数点の丸め誤差によるものです。

そのため、最近のコンパイラは十分に賢く、この最適化を行うことができるかもしれませんが、コンパイラのフラグで明示的に指示しない限り、この最適化は許可されません。

関連する なぜ、GCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?