Was stellt die Konstante 0,0039215689 dar?

Lesezeit: 3 Minuten

Benutzeravatar von crush
zerkleinern

Ich sehe dieses ständige Popup in verschiedenen Grafik-Header-Dateien

0.0039215689

Scheint vielleicht was mit der Farbe zu tun zu haben?

Hier ist der erste bei Google treffen:

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

Was stellt diese Zahl dar? Warum scheint es niemand als const zu deklarieren?

Bei Google habe ich nichts gefunden, was das erklärt.

  • Gibt es einen Grund, warum der Quellcode dies stattdessen schreiben würde? (1.f/255) ?

    – MM

    25. März 2014 um 0:37 Uhr


  • Mmmm … wenn es nur eine Möglichkeit gäbe, magische Zahlen zu vermeiden …

    – Paul Tucher

    25. März 2014 um 1:29 Uhr

  • 1/255 == 0.00(3921568627450980) — Klammern bedeuten Wiederholung.

    – jfs

    25. März 2014 um 5:06 Uhr

  • Mit Ihrer nächsten magischen Zahl, versuch mal Wolfram Alpha zu fragen

    – AakashM

    25. März 2014 um 9:31 Uhr

  • Was auch immer der Grund sein mag, es ist sehr uncool, eine magische Zahl zu verwenden, ohne ihren Zweck zu dokumentieren

    – Isaac Rabinovitch

    27. März 2014 um 19:13 Uhr

Benutzeravatar von Mystical
Mystisch

0.0039215689 ist ungefähr gleich 1/255.

Da dies OpenGL ist, ist die Leistung wahrscheinlich wichtig. Man kann also davon ausgehen, dass dies aus Leistungsgründen geschah.

Das Multiplizieren mit dem Kehrwert ist schneller als das wiederholte Teilen durch 255.


Randnotiz:

Wenn Sie sich fragen, warum eine solche Mikrooptimierung nicht dem Compiler überlassen wird, liegt das daran, dass es sich um eine unsichere Gleitkommaoptimierung handelt. Mit anderen Worten:

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

aufgrund von Gleitkomma-Rundungsfehlern.

Obwohl moderne Compiler klug genug sind, diese Optimierung durchzuführen, dürfen sie dies nicht tun, es sei denn, Sie weisen sie ausdrücklich über ein Compiler-Flag darauf hin.

Verwandt: Warum optimiert GCC a*a*a*a*a*a nicht zu (a*a*a)*(a*a*a)?

  • Ich wusste eigentlich nicht, was es war, als ich es zum ersten Mal sah. Aber angesichts der Art und Weise, wie es verwendet wurde, vermutete ich, dass es sich um die Multiplikation-mit-Reziprok-Optimierung handelte. Also habe ich meinen Taschenrechner eingecheckt und tatsächlich – ich habe richtig geraten.

    – Mystisch

    24. März 2014 um 22:08 Uhr


  • Ich hätte erwartet, es so geschrieben zu sehen a = b * (1.0f / 255); Compiler falten immer noch konstant, oder?

    – Ilmari Karonen

    24. März 2014 um 22:51 Uhr

  • @IlmariKaronen Ja, sie falten immer noch konstant. Es ist tatsächlich für einige Dinge wie Vorlagenauflösungen und dergleichen erforderlich. Aber ich hätte es einfach als Konstante oder Makro herausgezogen. Aber hey, nicht jeder Code ist perfekt geschrieben. 🙂

    – Mystisch

    24. März 2014 um 22:54 Uhr


  • @hippietrail Anfangs habe ich mich das auch gefragt. Aber wenn Sie 256 verwenden, würde es skalieren 0.0 - 0.996 stattdessen das Gewünschte 0.0 - 1.0. (0.996 = 255/256 wo 255 ist die größte 8-Bit-Ganzzahl)

    – Mystisch

    25. März 2014 um 18:53 Uhr

  • Und um meine eigene Frage zu beantworten, liegt es natürlich daran, dass die anderen beiden Zahlen nicht als Standard-C-Floats dargestellt werden können. Der nächste Float unter 0,0039215689 ist 0,0039215684.

    – Daniel Wächter

    26. März 2014 um 0:53 Uhr

Benutzeravatar von David Heffernan
David Heffernan

Diese Multiplikation mit 0.0039215689f wandelt eine ganzzahlige Farbintensität im Bereich von 0 bis 255 in eine reelle Farbintensität im Bereich von 0 bis 1 um.

Wie Ilmari Karonen betont, ist dies, auch wenn es sich um eine Optimierung handelt, eine ziemlich schlecht ausgedrückte. Es wäre so viel klarer, mit zu multiplizieren (1.0f/255).

  • Oder vielleicht besser als konstant definiert?

    – Johny

    25. März 2014 um 21:54 Uhr

  • @Johny Sicherlich als Konstante definiert. Der Punkt ist kein magischer Wert.

    – David Heffernan

    25. März 2014 um 22:01 Uhr

1427040cookie-checkWas stellt die Konstante 0,0039215689 dar?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy