ในปัญหานี้ เราได้รับจำนวนเต็ม 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