2013-10-23 2 views
19

आप इस बहुत अच्छा पेज को चेक करते हैं:तेजी से वर्ग रूट अनुकूलन?

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 होने का कोई उद्देश्य है?

+0

यदि आपका कंपाइलर दूसरे मामले में एक कम गुणा उत्पन्न कर रहा है तो मुझे संदेह है कि या तो (ए) आपने ऑप्टिमाइज़ेशन सक्षम नहीं किए हैं या (बी) आपका कंपाइलर बेकार है। ;-) –

+0

हो सकता है कि लेखक अपने सर्वश्रेष्ठ पर नहीं है, कुछ बेंच चलाएं, यदि केवल अंतर ही एक 'एमयूएल' है, तो उसके कोड के साथ आपके कोड के साथ थोड़ा कम होना चाहिए। –

+1

@PaulR क्यों 'xhalf' बिल्कुल? यह केवल एक बार प्रकट होता है, क्यों 'xhalf' मामला होगा? – user1095108

उत्तर

4

यह हो सकता है कि विरासत फ़्लोटिंग पॉइंट गणित, जो 80 बिट रजिस्टरों का उपयोग करता था, अधिक सटीक था जब मल्टीप्लायर जहां पिछली पंक्ति में एक साथ जुड़े हुए थे, मध्यवर्ती परिणामों के रूप में जहां 80 बिट रजिस्टरों में रखा गया था।

ऊपरी कार्यान्वयन में पहला गुणा पूर्णांक गणित के समानांतर में होता है, जो विभिन्न निष्पादन संसाधनों का उपयोग करते हैं। दूसरी तरफ दूसरा फ़ंक्शन तेज़ी से दिखता है लेकिन यह कहना मुश्किल है कि यह वास्तव में उपरोक्त की वजह से है या नहीं। इसके अलावा, कॉन्स फ्लोट xux = x * u.x; कथन परिणाम को 32 बिट फ्लोट तक कम कर देता है, जो समग्र सटीकता को कम कर सकता है।

आप इन कार्यों का परीक्षण कर सकते सिर की ओर बढ़ें और math.h में sqrt समारोह से उनकी तुलना (डबल का उपयोग तैर नहीं)। इस तरह आप देख सकते हैं कि कौन सा तेज़ है और जो अधिक सटीक है।

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