Ini hanya untuk memuaskan rasa penasaran saya sendiri.
Apakah ada implementasi ini:
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;
}
di Rust? Jika ada, kirim kode.
Saya mencobanya dan gagal. Saya tidak tahu cara menyandikan angka float menggunakan format integer. Ini usaha saya:
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
}
Referensi:
1. Origin of Quake3's Fast InvSqrt () - Halaman 1
2. Memahami Root Inverse Square Cepat Quake
3. ROAST INVESTE SQUARE ROOT.pdf
4. kode sumber: q_math.c # L552-L572
union
.
union
berhasil juga. memcpy
pasti bekerja, meskipun itu verbose.
rsqrtss
dan rsqrtps
instruksi, diperkenalkan dengan Pentium III pada tahun 1999, lebih cepat dan lebih akurat daripada kode ini. NEON ARM memiliki vrsqrte
yang serupa. Dan perhitungan apa pun yang digunakan Quake III untuk ini mungkin akan dilakukan pada GPU akhir-akhir ini.