फोरट्रान (वैज्ञानिक कंप्यूटिंग के लिए डिज़ाइन किया गया) में एक अंतर्निहित पावर ऑपरेटर है, और जहां तक मुझे पता है कि फोरट्रान कंपाइलर्स आमतौर पर पूर्णांक शक्तियों को एक समान फैशन में बढ़ाने का अनुकूलन करेंगे जो आप वर्णन करते हैं। C / C ++ दुर्भाग्य से पावर ऑपरेटर नहीं है, केवल लाइब्रेरी फ़ंक्शन pow()
। यह स्मार्ट कंपाइलरों को pow
विशेष रूप से इलाज करने और विशेष मामलों के लिए तेजी से गणना करने से नहीं रोकता है , लेकिन ऐसा लगता है कि वे इसे आमतौर पर कम करते हैं ...
कुछ साल पहले मैं एक इष्टतम तरीके से पूर्णांक शक्तियों की गणना करने के लिए इसे और अधिक सुविधाजनक बनाने की कोशिश कर रहा था, और निम्नलिखित के साथ आया था। यह C ++ है, न कि C, और फिर भी कंपाइलर पर निर्भर करता है कि वह कुछ स्मार्ट हो कि चीजों को कैसे ऑप्टिमाइज़ / इनलाइन करें। वैसे भी, आशा है कि आप इसे व्यवहार में उपयोगी पा सकते हैं:
template<unsigned N> struct power_impl;
template<unsigned N> struct power_impl {
template<typename T>
static T calc(const T &x) {
if (N%2 == 0)
return power_impl<N/2>::calc(x*x);
else if (N%3 == 0)
return power_impl<N/3>::calc(x*x*x);
return power_impl<N-1>::calc(x)*x;
}
};
template<> struct power_impl<0> {
template<typename T>
static T calc(const T &) { return 1; }
};
template<unsigned N, typename T>
inline T power(const T &x) {
return power_impl<N>::calc(x);
}
जिज्ञासु के लिए स्पष्टीकरण: यह शक्तियों की गणना करने का इष्टतम तरीका नहीं ढूंढता है, लेकिन चूंकि इष्टतम समाधान एनपी-पूर्ण समस्या है और यह केवल वैसे भी छोटी शक्तियों के लिए करने योग्य है (जैसा कि उपयोग करने का विरोध किया गया है pow
), उपद्रव का कोई कारण नहीं है। विस्तार के साथ।
तो बस के रूप में उपयोग करें power<6>(a)
।
इससे शक्तियों को टाइप करना आसान हो जाता है ( a
Parens के साथ 6 s को स्पेल करने की कोई आवश्यकता नहीं है ), और आपको इस प्रकार के अनुकूलन की अनुमति -ffast-math
देता है, यदि आपके पास कुछ सटीक निर्भरता है जैसे कि क्षतिपूर्ति योग (उदाहरण जहां संचालन का क्रम आवश्यक है) ।
आप शायद यह भी भूल सकते हैं कि यह C ++ है और इसे C प्रोग्राम में उपयोग करें (यदि यह C ++ कंपाइलर के साथ संकलित है)।
आशा है कि यह उपयोगी हो सकता है।
संपादित करें:
मुझे अपने कंपाइलर से यही मिलता है:
के लिए a*a*a*a*a*a
,
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
के लिए (a*a*a)*(a*a*a)
,
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm0, %xmm0
के लिए power<6>(a)
,
mulsd %xmm0, %xmm0
movapd %xmm0, %xmm1
mulsd %xmm0, %xmm1
mulsd %xmm0, %xmm1