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


310

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

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 14年

12
1/255 == 0.00(3921568627450980)-括弧は繰り返しを意味します。
jfs 2014年

82
あなたの次のマジックナンバーで、ウルフラムアルファ尋ねてみてください
AakashM

12
理由が何であれ、その目的を文書化せずにマジックナンバーを使用することは非常にクールです
Isaac Rabinovitch

回答:


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 2014年

55
私はそれがと書かれるのを見ると思っていたでしょうa = b * (1.0f / 255)。コンパイラは依然として定数の折りたたみを行いますね。
Ilmari Karonen 14年

9
@IlmariKaronenはい、彼らはまだ一定の折り畳みを行っています。これは実際には、テンプレートの解像度などの一部に必要です。しかし、私はそれを定数またはマクロとして引き出しただけです。ただし、すべてのコードが完全に記述されているわけではありません。:)
Mysticial 2014年

5
@hippietrail最初は同じことを考えていました。ただし、256を使用する場合、0.0 - 0.996代わりに望ましいからスケーリングされます0.0 - 1.0。(最大8ビットの整数である)0.996 = 255/256255
Mysticial

7
そしてもちろん、私自身の質問に答えるために、他の2つの数値は標準のC浮動小数点数として表現できないためです。0.0039215689の下の次のフロートは0.0039215684です。
Daniel Waechter 14年

79

この乗算0.0039215689fは、0から255の範囲の整数値のカラー強度を0から1の範囲の実数値のカラー強度に変換します。

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


5
それとも定数として定義された方がいいのでしょうか?
ジョニー

9
@Johny確かに定数として定義されています。ポイントは魔法の価値ではありません。
David Heffernan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.