2016-05-23 6 views
9

मैं केरमेक की तेजी से उलटा वर्गमूल एल्गोरिथ्म के बारे में पढ़ रहा था dereferenced है और इस पर ध्यान:कोई इस प्रकार के कास्ट का उपयोग सी में क्यों करेगा? एक नाव के संदर्भ किसी पूर्णांक सूचक को डाला जाता है और उसके बाद

float x; 
// ... // 
int i = *(int*)&x; 

क्यों किसी के बजाय कास्टिंग के इस अजीब प्रकार का उपयोग करने का निर्णय लेंगे बस निम्नलिखित?

int i = (int)x; 
+3

केरमेक वास्तव में एल्गोरिथ्म नहीं लिखा था ; [विकी पेज] देखें (https://en.wikipedia.org/wiki/Fast_inverse_square_root#History_and_investigation)। – DylanSp

उत्तर

28

यह अलग है।

int i = (int) x;float से int पर डालेगा, जो इसे आसानी से छोटा कर देगा।

int i = *(int *) &x; में लोड हो जाएगा जो वर्तमान में x में संग्रहीत हैं। परिणाम x को छंटनी से पूरी तरह से अलग है।

+1

और दूसरा विकल्प क्यों चुनता है? एकमात्र कारण यह है कि मैं इसके बारे में सोच सकता हूं कि वे सीधे फ्लोट के थोड़ा प्रतिनिधित्व में हस्तक्षेप करना चाहते हैं। – Giorgio

+10

यही विचार मुझे लगता है। – aragaer

+2

हाँ, यह विचार है। मैं उत्सुक था क्योंकि यह एक सुंदर बेकार विचार की तरह प्रतीत होता है जबतक कि आप पहले से ही विशेषता/मंटिसा फ्लोट प्रारूप को नहीं जानते हैं, लेकिन https://en.wikipedia.org/wiki/Fast_inverse_square_root बताते हैं। –

15

इसे type punning कहा जाता है। यह float को int के रूप में व्याख्या करेगा। मतलब, थोड़ा प्रतिनिधित्व बिल्कुल कॉपी किया गया है।

यह एक संभावित खतरनाक ऑपरेशन है, क्योंकि फ्लोटिंग पॉइंट पूर्णांक के कुछ छोटे प्रस्तुतियां पूर्णांक के रूप में जाल प्रस्तुतिकरण हो सकती हैं (हालांकि आईईईई -754 फ्लोट्स और 2 एस पूरक पूर्णांक के मामले में नहीं)।

इसके अतिरिक्त, यह सी मानक के अनुसार अपरिभाषित व्यवहार होने के कारण अब और काम नहीं कर सकता है। यह सख्त एलियासिंग नियम का उल्लंघन कर रहा है।

सी केवल memcpy के माध्यम से एक अलग प्रकार के चर का उपयोग करने का समर्थन करता है। ,

int y; float x = 42.0f; 
memcpy(&y, &x, sizeof(x)); 

C99 ऐसा करने का एक और तरीका है जोड़ा एक union का उपयोग करके:

इस आपरेशन लिखने के वैध मानक सी तरीका है

union { int y; float x; } u = { .x = 42.0f }; 
int y = u.y; 
+0

संघ की बात सख्त एलियासिंग का भी उल्लंघन नहीं करती है? – Random832

+0

@ Random832 आपके द्वारा उपयोग किए जा रहे सी मानक पर निर्भर करता है। सी 99 के बाद से, यह अब उल्लंघन नहीं है। चूंकि अधिकांश कंपाइलर्स ने कुछ हद तक इसे पहले ही अनुमति दी है, मानक ने इसे आधिकारिक बना दिया है। – Leandros

+0

मैं उत्सुक हूं कि दो दृष्टिकोणों के बीच प्रदर्शन अंतर है (पनिंग बनाम यूनियनों को टाइप करें)। – Dai

संबंधित मुद्दे

 संबंधित मुद्दे