Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

สแควร์รูทผกผันอย่างรวดเร็วใน C ++


ในปัญหานี้ เราได้รับจำนวนเต็ม x งานของเราคือการคำนวณ รากที่สองแบบผกผันอย่างรวดเร็ว ( ) ของเลขทศนิยมแบบ 32 บิต

อัลกอริทึมในการค้นหาสแควร์รูทผกผันของจำนวนนั้นมีประโยชน์อย่างมากในการเขียนโปรแกรม เช่น vector normalization ในวิดีโอเกม ในกราฟิก 3 มิติ เป็นต้น

อัลกอริทึม:

ขั้นตอนที่ 1: อัลกอริทึมแปลงค่าจุดลอยตัว เป็นจำนวนเต็ม

ขั้นตอนที่ 2: ดำเนินการกับค่าจำนวนเต็มและส่งคืนค่าโดยประมาณของรากที่สองผกผัน

ขั้นตอนที่ 3: แปลงค่าจำนวนเต็มกลับไปเป็นจุดลอยตัวโดยใช้วิธีการเดียวกับที่ใช้ในขั้นตอนที่ 1

ขั้นตอนที่ 4: การประมาณนี้ทำขึ้นเพื่อปรับปรุงความแม่นยำโดยใช้วิธีของ นิวตัน

โปรแกรมแสดงการทำงานของอัลกอริทึม:

ตัวอย่าง

#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