2013-02-07 33 views
28

मैं इस दस्तावेज़ पढ़ रहा हूँ की व्याख्या कर सकते हैं: http://software.intel.com/en-us/articles/interactive-ray-tracingन्यूटन Raphson कोई मुझे इन 3 लाइनों

और मैं कोड के इन तीन लाइनों पर ठोकर खाई:

SIMD संस्करण पहले से ही है काफी थोड़ा तेज़, लेकिन हम बेहतर कर सकते हैं। इंटेल ने एसएसई 2 निर्देश सेट में एक तेज़ 1/वर्ग (x) फ़ंक्शन जोड़ा है। एकमात्र कमी यह है कि इसकी परिशुद्धता सीमित है। हम परिशुद्धता की जरूरत है, ताकि हम इसे न्यूटन-Rhapson का उपयोग कर परिशोधित करें:

__m128 nr = _mm_rsqrt_ps(x); 
__m128 muls = _mm_mul_ps(_mm_mul_ps(x, nr), nr); 
result = _mm_mul_ps(_mm_mul_ps(half, nr), _mm_sub_ps(three, muls)); 

इस कोड को 'आधा' (चार बार 0.5f) और एक चर 'नाम के एक __m128 चर के अस्तित्व को मानता तीन '(चार बार 3.0 एफ)।

मैं न्यूटन Raphson उपयोग करने के लिए कैसे एक समारोह के शून्य की गणना करने के पता है और मैं इसे कैसे उपयोग करने के लिए एक संख्या का वर्गमूल गणना करने के लिए, लेकिन मैं तो बस नहीं देख सकते हैं कि इस कोड को यह करता है पता है।

क्या कोई मुझे कृपया समझा सकता है?

उत्तर

34

न्यूटन पुनरावृत्ति y_n+1=y_n(3-x(y_n)^2)/2 को देखते हुए, यह स्रोत कोड में इसे देखने के लिए काफी आगे होना चाहिए।

__m128 nr = _mm_rsqrt_ps(x);     // The initial approximation y_0 
__m128 muls = _mm_mul_ps(_mm_mul_ps(x, nr), nr); // muls = x*nr*nr == x(y_n)^2 
result = _mm_mul_ps(
       _mm_sub_ps(three, muls) // this is 3.0 - mul; 
    /*multiplied by */ __mm_mul_ps(half,nr) // y_0/2 or y_0 * 0.5 
); 

और सटीक होना करने के लिए, इस एल्गोरिथ्म the inverse square root के लिए है।

ध्यान दें कि यह still doesn't give fully a fully accurate result है। एनआर पुनरावृत्ति के साथ rsqrtps सटीकता के लगभग 23 बिट्स देता है, बनाम sqrtps की 24 बिट्स को अंतिम बिट के लिए सही गोल करने के साथ।

यदि आप truncate the result to integer चाहते हैं तो सीमित सटीकता एक समस्या है। (int)4.999994 है। का उपयोग करते हुए का उपयोग करते हुए, x == 0.0 मामले के लिए देखें, क्योंकि 0 * +Inf = NaN

+0

पूर्णांक को छोटा करते समय, क्या आपको लगता है कि यह एक वैल्यू जोड़ने के लिए अंतिम चरण के रूप में व्यवहार्य होगा, जिसके परिणामस्वरूप एक ही एक्सपोनेंट होता है लेकिन महत्व में केवल निम्नतम (या दो?) बिट्स सेट होते हैं? यह निश्चित रूप से इस शर्त के तहत है कि कम से कम महत्वपूर्ण आंकड़ा हमेशा किसी की स्थिति से कम होता है। – chili

+0

यह एप्लिकेशन निर्भर है। मुद्दा यह है कि एक पुनरावृत्ति दृष्टिकोण 'sqrt (n * n) == n' का उपयोग करते समय हमेशा पकड़ नहीं होता है। इसे मनमाने ढंग से "निश्चित" नहीं किया जा सकता है - क्योंकि 'sqrt (n * n - epsilon) == n' आपदा का कारण बन सकता है। –

3

a का प्रतिलोम वर्गमूल गणना करने के लिए, न्यूटन की विधि व्युत्पन्न f'(x)=2*x^(-3) साथ समीकरण 0=f(x)=a-x^(-2) को लागू किया जाता है और इस तरह यात्रा कदम

N(x) = x - f(x)/f'(x) = x - (a*x^3-x)/2 
    = x/2 * (3 - a*x^2) 

यह विभाजन से मुक्त विधि है - विश्व स्तर पर converging के विपरीत Heron's method - अभिसरण का एक सीमित क्षेत्र, इसलिए आपको बेहतर अनुमान प्राप्त करने के लिए व्यस्त वर्ग रूट के पहले से ही अच्छे अनुमान की आवश्यकता है।