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
.
union
marche non plus. memcpy
fonctionne certainement, bien qu'il soit verbeux.
rsqrtss
et rsqrtps
, introduites avec le Pentium III en 1999, sont plus rapides et plus précises que ce code. ARM NEON a vrsqrte
qui 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.