निरंतर 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

यह संख्या क्या दर्शाती है? कोई भी इसे एक कास्ट घोषित करने के लिए क्यों नहीं लगता है?

मुझे Google पर ऐसा कुछ भी नहीं मिला जिसने इसे समझाया हो।


16
क्या कोई कारण है कि सोर्स कोड इसके बजाय लिखेगा (1.f/255)?
MM

53
मम्म ... अगर केवल जादू की संख्या से बचने के लिए कुछ तरीके थे ....
पॉल ड्रपर

12
1/255 == 0.00(3921568627450980)- परेंस का अर्थ है पुनरावृत्ति।
JFS

82
अपने अगले मैजिक नंबर के साथ,
वुल्फराम

12
जो भी कारण, अपने उद्देश्य को दस्तावेज के बिना एक जादू की संख्या का उपयोग करना बहुत ही अशिष्ट है
आइजैक राबिनोविच

जवाबों:


378

0.0039215689के बराबर है 1/255

यह देखते हुए कि यह OpenGL है, प्रदर्शन संभवतः महत्वपूर्ण है। इसलिए यह अनुमान लगाना सुरक्षित है कि यह प्रदर्शन कारणों से किया गया था।

पारस्परिक द्वारा गुणा करना बार-बार 255 से विभाजित करने की तुलना में तेज़ है।


पक्षीय लेख:

यदि आप सोच रहे हैं कि इस तरह के माइक्रो-ऑप्टिमाइज़र को कंपाइलर पर क्यों नहीं छोड़ा जाता है, तो यह इसलिए है क्योंकि यह एक असुरक्षित फ़्लोटिंग-पॉइंट ऑप्टिमाइज़ेशन है। दूसरे शब्दों में:

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

फ्लोटिंग-पॉइंट राउंड-ऑफ त्रुटियों के कारण।

इसलिए जब आधुनिक कंपाइलर इस अनुकूलन को करने के लिए पर्याप्त स्मार्ट हो सकते हैं, तो उन्हें ऐसा करने की अनुमति नहीं है जब तक कि आप स्पष्ट रूप से उन्हें कंपाइलर ध्वज के माध्यम से नहीं बताते हैं।

संबंधित: GCC एक a * a * a * a a (a (a * a *) * (a * a * a) ऑप्टिमाइज़ क्यों नहीं करता?


10
मैं वास्तव में नहीं जानता था कि यह क्या था जब मैंने पहली बार इसे देखा था। लेकिन जिस तरह से इसका इस्तेमाल किया गया था, उसे देखते हुए, मुझे संदेह था कि यह बहु-पारस्परिक पारस्परिक अनुकूलन था। इसलिए मैंने अपने कैलकुलेटर में जाँच की और निश्चित रूप से पर्याप्त - मैंने सही अनुमान लगाया।
22

55
मैंने इसे लिखित रूप में देखने की अपेक्षा की होगी a = b * (1.0f / 255); संकलक अभी भी लगातार तह करते हैं, नहीं?
इल्मरी करोनें

9
@ इल्मारीकरोनन हां, वे अभी भी लगातार तह करते हैं। यह वास्तव में टेम्पलेट संकल्प और जैसे कुछ सामान के लिए आवश्यक है। लेकिन मैंने अभी इसे स्थिरांक या स्थूल के रूप में बाहर निकाला है। लेकिन हे, सभी कोड पूरी तरह से नहीं लिखे गए हैं। :)
22

5
@hippietrail शुरू में, मैं एक ही बात सोच रहा था। लेकिन अगर आप 256 का उपयोग करते हैं, तो यह 0.0 - 0.996वांछित के बजाय पैमाने से होगा 0.0 - 1.0। ( 0.996 = 255/256जहां 255सबसे बड़ा 8-बिट पूर्णांक है)
मिस्ट्रीकल

7
और हां, मेरे खुद के सवाल का जवाब देने के लिए, यह इसलिए है क्योंकि अन्य दो नंबरों को मानक सी फ्लोट के रूप में प्रतिनिधित्व नहीं किया जा सकता है। अगला फ़्लोट 0.0039215689 से नीचे 0.0039215684 है।
डैनियल वेचर

79

यह गुणन 0.0039215689f0 से 255 में पूर्णांक मूल्यवान रंग तीव्रता को श्रेणी 0 से 1 में वास्तविक मूल्यवान रंग तीव्रता में परिवर्तित करता है।

जैसा कि इल्मरी करोनन बताते हैं, भले ही यह एक अनुकूलन है लेकिन यह एक बुरी तरह से व्यक्त किया गया है। यह गुणा करने के लिए इतना स्पष्ट होगा (1.0f/255)


5
या शायद बेहतर, स्थिर के रूप में परिभाषित?
जॉनी

9
@ जॉनी निश्चित रूप से एक स्थिरांक के रूप में परिभाषित किया गया है। बिंदु एक जादू मूल्य नहीं है।
डेविड हेफर्नन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.