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