นี่เป็นเพียงเพื่อสนองความอยากรู้อยากเห็นของฉันเอง
มีการดำเนินการตามนี้หรือไม่:
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. ต้นกำเนิดของ Fast InvSqrt () ของ Quake3 - หน้า 1
2. ทำความเข้าใจกับรากที่สองของ Quake ได้อย่างรวดเร็ว
3. FAST INVERSE SQUARE ROOT.pdf
4. ซอร์สโค้ด: q_math.c # L552-L572
union
วิธีมาตรฐานมีความสุขในการดำเนินการชนิดของประเภทเล่นสำนวนนี้อยู่ด้วย
union
ทำงานอย่างใดอย่างหนึ่ง memcpy
ใช้งานได้ดีแม้ว่ามันจะเป็น verbose
rsqrtss
และrsqrtps
คำแนะนำที่ใช้กับ Pentium III ในปี 1999 นั้นเร็วกว่าและแม่นยำกว่ารหัสนี้ ARM NEON นั้นมีอะไรvrsqrte
ที่คล้ายกัน และการคำนวณอะไรก็ตาม Quake III ที่ใช้สิ่งนี้อาจจะทำบน GPU ในทุกวันนี้