C'est juste pour satisfaire ma propre curiosité.
Y a-t-il une implémentation de ceci:
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? S'il existe, affichez le code.
J'ai essayé et j'ai échoué. Je ne sais pas comment encoder le nombre flottant en utilisant le format entier. Voici ma tentative:
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
}
Référence:
1. Origine de Quake3's Fast InvSqrt () - Page 1
2. Comprendre la racine carrée inverse rapide de Quake
3. FAST INVERSE SQUARE ROOT.pdf
4. code source: q_math.c # L552-L572
union.
unionmarche non plus. memcpyfonctionne certainement, bien qu'il soit verbeux.
rsqrtsset rsqrtps, introduites avec le Pentium III en 1999, sont plus rapides et plus précises que ce code. ARM NEON a vrsqrtequi est similaire. Et quels que soient les calculs utilisés par Quake III, cela serait probablement fait sur le GPU ces jours-ci de toute façon.