এই সমস্যায়, আমাদের একটি ইন্টিজার x দেওয়া হয়েছে। আমাদের কাজ হলো ৩২-বিট ফ্লোটিং পয়েন্ট সংখ্যার ফাস্ট ইনভার্স স্কয়ার রুট ক্যালকুলেট করা।
সংখ্যার ইনভার্স স্কয়ার রুট বের করার এই অ্যালগরিদম প্রোগ্রামিং-এ ব্যাপকভাবে ব্যবহৃত হয়, যেমন ভিডিও গেমে ভেক্টর নরমালাইজেশন, ৩ডি গ্রাফিক্স ইত্যাদি।
অ্যালগরিদম:
স্টেপ ১: অ্যালগরিদমটি ফ্লোটিং পয়েন্ট ভ্যালুকে ইন্টিজারে রূপান্তর করে।
স্টেপ ২: ইন্টিজার ভ্যালুতে অপারেশন করে ইনভার্স স্কয়ার রুটের এপ্রক্সিমেট ভ্যালু রিটার্ন করে।
স্টেপ ৩: স্টেপ ১-এ ব্যবহৃত পদ্ধতিতেই ইন্টিজার ভ্যালুকে আবার ফ্লোটিং পয়েন্টে রূপান্তর করে।
স্টেপ ৪: নিউটনের পদ্ধতি ব্যবহার করে এপ্রক্সিমেশন থেকে প্রিসিশন উন্নত করা হয়।
অ্যালগরিদমটি ব্যাখ্যা করে প্রোগ্রাম:
#include <iostream>
using namespace std;
float calcInvSqRoot(float n) {
const float threehalfs = 1.5F;
float y = n;
long i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs - ( (n * 0.5F) * y * y ) );
return y;
}
int main() {
int n = 256;
float invSqRoot = calcInvSqRoot(n);
cout << "The inverse square root of the number " << n << " is " << invSqRoot;
return 0;
}
আউটপুট
The inverse square root of the number 256 is 0.0623942