Kann man die schnelle inverse Quadratwurzel aus Quake in Rust implementieren?
Hallo zusammen! Ich lerne Rust und bin auf die legendäre Funktion InvSqrt() aus dem Spiel Quake III Arena gestoßen, die 1/sqrt(x) unglaublich schnell durch Bit-Hacks berechnet. In C/C++ sieht sie so aus:
```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; // böser Cast (type punning)
i = 0x5f3759df - ( i >> 1 ); // magische Konstante
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // eine Newton-Iteration
return y;
}
```
Das Problem ist, dass in Rust ein solcher direkter Pointer-Cast (`*(long*)&y`) als undefiniertes Verhalten (UB) gilt und verboten ist. Ich habe es mit `transmute` versucht:
```rust
fn inv_sqrt(x: f32) -> f32 {