आप इस बहुत अच्छा पेज को चेक करते हैं:तेजी से वर्ग रूट अनुकूलन?
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
आप इस कार्यक्रम देखेंगे:
#define SQRT_MAGIC_F 0x5f3759df
float sqrt2(const float x)
{
const float xhalf = 0.5f*x;
union // get bits for floating value
{
float x;
int i;
} u;
u.x = x;
u.i = SQRT_MAGIC_F - (u.i >> 1); // gives initial guess y0
return x*u.x*(1.5f - xhalf*u.x*u.x);// Newton step, repeating increases accuracy
}
मेरे सवाल यह है: कोई विशेष कारण है कि इस के रूप में लागू नहीं किया गया है:
#define SQRT_MAGIC_F 0x5f3759df
float sqrt2(const float x)
{
union // get bits for floating value
{
float x;
int i;
} u;
u.x = x;
u.i = SQRT_MAGIC_F - (u.i >> 1); // gives initial guess y0
const float xux = x*u.x;
return xux*(1.5f - .5f*xux*u.x);// Newton step, repeating increases accuracy
}
के रूप में, disassembly से, मैं एक MUL
कम देखते हैं। क्या xhalf
होने का कोई उद्देश्य है?
यदि आपका कंपाइलर दूसरे मामले में एक कम गुणा उत्पन्न कर रहा है तो मुझे संदेह है कि या तो (ए) आपने ऑप्टिमाइज़ेशन सक्षम नहीं किए हैं या (बी) आपका कंपाइलर बेकार है। ;-) –
हो सकता है कि लेखक अपने सर्वश्रेष्ठ पर नहीं है, कुछ बेंच चलाएं, यदि केवल अंतर ही एक 'एमयूएल' है, तो उसके कोड के साथ आपके कोड के साथ थोड़ा कम होना चाहिए। –
@PaulR क्यों 'xhalf' बिल्कुल? यह केवल एक बार प्रकट होता है, क्यों 'xhalf' मामला होगा? – user1095108