Est-il possible d'implémenter la racine carrée inverse rapide de Quake en Rust ?
Bonjour à tous ! J'apprends Rust et je suis tombé sur la légendaire fonction InvSqrt() du jeu Quake III Arena, qui calcule 1/sqrt(x) incroyablement rapidement via des hacks binaires. En C/C++, elle ressemble à ceci :
```c
float Q_rsqrt(float number) {
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // type punning maléfique
i = 0x5f3759df - ( i >> 1 ); // constante magique
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // une itération de Newton
return y;
}
```
Le problème est qu'en Rust, un tel cast direct de pointeur (`*(long*)&y`) est considéré comme un comportement indéfini (UB) et interdit. J'ai essayé de le faire via `transmute` :
```rust
fn inv_sqrt(x: f32) -> f32 {
let x2 = x * 0.5;
let mut y = x;
let mut i: i32 = unsafe { std::mem::transmute(y) };
i = 0x5f3759df - (i >> 1);
y = unsafe { std::mem::transmute(i) };
y * (1.5 - x2 * y * y)