एक जगह जहां मैंने इसे देखा है, डूम 3/आईडीटेक 4 Fast Inverse Square Root कार्यान्वयन में है।
इस एल्गोरिदम से अपरिचित लोगों के लिए, अनिवार्य रूप से एक फ़्लोटिंग पॉइंट नंबर को पूर्णांक के रूप में इलाज करने की आवश्यकता होती है। वर्ष भूकंप (और पुराने) कोड के संस्करण करके करता है निम्नलिखित:
float y = 2.0f;
// treat the bits of y as an integer
long i = * (long *) &y;
// do some stuff with i
// treat the bits of i as a float
y = * (float *) &i;
original source on GitHub
इस कोड को एक चल बिन्दु संख्या y
का पता लगता है, एक सूचक के लिए यह एक लंबा करने के लिए डाले (यानी, क्वैक दिनों में 32 बिट पूर्णांक), और इसे i
में खराब कर देता है। फिर यह कुछ अविश्वसनीय रूप से विचित्र बिट-ट्विडलिंग सामान, और रिवर्स करता है।
इस तरह से ऐसा करने के दो नुकसान हैं। एक यह है कि एक मजबूत , और पीछे की तरफ जाने के बजाय, स्मृति से पढ़ने के लिए y
के मूल्य को नियंत्रित करने के लिए, कास्ट, डीरेंसेंस प्रक्रिया को मजबूत किया गया है। क्वैक-युग कंप्यूटर पर, हालांकि, फ्लोटिंग पॉइंट और इंटीजर रजिस्ट्रार पूरी तरह से अलग थे, इसलिए आपको इस प्रतिबंध से निपटने के लिए मेमोरी को वापस धक्का देना पड़ा।
दूसरी बात यह है कि, कम से कम सी ++ में, इस तरह के कास्टिंग करने पर इस तरह के कास्टिंग करने पर वूडू की मात्रा में काम करने पर भी गहराई से डूब जाता है। मुझे यकीन है कि और अधिक आकर्षक तर्क हैं, हालांकि मुझे यकीन नहीं है कि वे क्या हैं :)
तो, डूम 3 में, आईडी में उनके नए कार्यान्वयन में निम्नलिखित बिट शामिल था (जो बिट ट्विडलिंग के एक अलग सेट का उपयोग करता है, लेकिन एक समान विचार):
union _flint {
dword i;
float f;
};
...
union _flint seed;
seed.i = /* look up some tables to get this */;
double r = seed.f; // <- access the bits of seed.i as a floating point number
original source on GitHub
सैद्धांतिक रूप से, एक SSE2 मशीन पर, यह एक एकल रजिस्टर के माध्यम से पहुँचा जा सकता है; मुझे अभ्यास में यकीन नहीं है कि कोई संकलक ऐसा करेगा या नहीं। पहले के क्वैक संस्करण में कास्टिंग गेम की तुलना में यह मेरी राय में कुछ हद तक क्लीनर कोड है।
- अनदेखी "पर्याप्त रूप से उन्नत संकलक" तर्कों
[टाइप punning] पर एक नजर डालें (http://en.wikipedia.org/wiki/Type_punning)। – Mysticial
यह उन परिस्थितियों में उपयोगी हो सकता है जहां आपको पॉइंटर हैक्स का उपयोग किए बिना किसी संरचना को इसके बाइनरी मानों (जैसे एक char []) में परिवर्तित करने की आवश्यकता होती है। –
[सी/सी ++ का संभावित डुप्लिकेट: जब कोई संघ का उपयोग करेगा? क्या यह मूल रूप से केवल सी से अवशेष है?] (Http: // stackoverflow।कॉम/प्रश्न/4788 9 65/सीसी-कब-कभी-किसी भी-उपयोग-ए-यूनियन-यह-मूल रूप से-एक-अवशेष-से-द-सी-केवल) –