ফোর্টরান (বৈজ্ঞানিক কম্পিউটিংয়ের জন্য ডিজাইন করা) একটি বিল্ট-ইন পাওয়ার অপারেটর রয়েছে এবং আমি যতদূর জানি ফোরট্রান সংকলকরা সাধারণত যা বর্ণনা করেন তার সাথে একই ধরণের পূর্ণসংখ্যার শক্তিতে উত্সাহিত করবে। সি / সি ++ দুর্ভাগ্যক্রমে পাওয়ার অপারেটর নেই, কেবল লাইব্রেরি ফাংশন pow()
। এটি স্মার্ট সংকলকগুলিকে pow
বিশেষভাবে চিকিত্সা করা এবং বিশেষ ক্ষেত্রে এটির দ্রুত গতিতে গণনা করা থেকে বিরত রাখে না , তবে মনে হয় তারা এটি সাধারণত কম ব্যবহার করেন ...
কয়েক বছর আগে আমি একটি অনুকূল উপায়ে পূর্ণসংখ্যার শক্তি গণনা করার জন্য এটি আরও সুবিধাজনক করার চেষ্টা করছিলাম, এবং নিম্নলিখিতগুলি নিয়ে এসেছি। এটি সি ++, সি নয়, এবং এখনও কীভাবে অপ্টিমাইজ / ইনলাইন করা যায় সে সম্পর্কে সংকলকটি কিছুটা স্মার্ট হওয়ার উপর নির্ভর করে। যাইহোক, আশা করি আপনি এটি অনুশীলনে কার্যকর হতে পারেন:
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
প্যারেনগুলির সাথে spe টি উচ্চারণের প্রয়োজন নেই), এবং ক্ষতিপূরণী সমষ্টি (যেমন অপারেশনের ক্রম প্রয়োজনীয়) উদাহরণস্বরূপ -ffast-math
আপনার যদি কিছু নির্ভুলতা নির্ভর না হয় তবে আপনাকে এই ধরণের অপ্টিমাইজেশন করতে দেয় ) ।
আপনি সম্ভবত এটিও ভুলে যেতে পারেন যে এটি সি ++ এবং কেবল এটি সি প্রোগ্রামে ব্যবহার করুন (যদি এটি সি ++ সংকলক সহ সংকলন করে)।
আশা করি এটি কার্যকর হতে পারে।
সম্পাদনা করুন:
আমার সংকলক থেকে এটিই আমি পেয়েছি:
জন্য 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