Đây chỉ là để thỏa mãn sự tò mò của riêng tôi.
Có thực hiện điều này:
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;
}
ở Rust? Nếu nó tồn tại, gửi mã.
Tôi đã thử nó và thất bại. Tôi không biết cách mã hóa số float bằng định dạng số nguyên. Đây là nỗ lực của tôi:
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
}
Tham khảo:
1. Nguồn gốc của InvSqrt nhanh của Quake3 () - Trang 1
2. Tìm hiểu căn bậc hai nghịch đảo nhanh của Quake
3. TÌM KIẾM NHANH CHÓNG ROOT.pdf
4. mã nguồn: q_math.c # L552-L572
union
.
union
là có tác dụng. memcpy
chắc chắn hoạt động, mặc dù nó dài dòng.
rsqrtss
và các rsqrtps
hướng dẫn, được giới thiệu với Pentium III năm 1999, nhanh hơn và chính xác hơn mã này. ARM NEON có vrsqrte
tương tự. Và bất cứ tính toán nào Quake III sử dụng điều này có lẽ sẽ được thực hiện trên GPU ngày nay.