এটি কেবল আমার নিজের কৌতূহল মেটাতে।
এটির কোনও বাস্তবায়ন কি:
float InvSqrt (float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}
মরিচায়? যদি এটি বিদ্যমান থাকে তবে কোডটি পোস্ট করুন।
আমি চেষ্টা করেছিলাম এবং ব্যর্থ হয়েছি। আমি জানি না কীভাবে পূর্ণসংখ্যা বিন্যাসটি ব্যবহার করে ফ্লোট নম্বরটি এনকোড করতে পারি। এখানে আমার প্রচেষ্টা:
fn main() {
println!("Hello, world!");
println!("sqrt1: {}, ",sqrt2(100f64));
}
fn sqrt1(x: f64) -> f64 {
x.sqrt()
}
fn sqrt2(x: f64) -> f64 {
let mut x = x;
let xhalf = 0.5*x;
let mut i = x as i64;
println!("sqrt1: {}, ", i);
i = 0x5f375a86 as i64 - (i>>1);
x = i as f64;
x = x*(1.5f64 - xhalf*x*x);
1.0/x
}
রেফারেন্স:
1. Quake3 এর ফাস্ট InvSqrt অরিজিন () - পৃষ্ঠা 1
2. বোঝাপড়া কোয়েক এর ফাস্ট বিপরীত বর্গ রুট
3. দ্রুত বিপরীত বর্গ ROOT.pdf
4. সোর্স কোড: q_math.c # L552-L572
union
।
union
হয় না যে এটি কাজ করে। memcpy
স্পষ্টতই এটি কাজ করে, যদিও এটি ভার্বোস।
rsqrtss
এবং rsqrtps
নির্দেশাবলী এই কোডের চেয়ে দ্রুত এবং আরও নির্ভুল। এআরএম নিওনেরও vrsqrte
মিল রয়েছে। এবং ভূমিকম্প তৃতীয় যে কোনও গণনাগুলির জন্য এটি ব্যবহার করেছে সম্ভবত এই দিনগুলিতে জিপিইউতে সম্পন্ন হবে।