Avatar ·

能否在Rust中实现Quake中的快速逆平方根?

大家好!我正在学习Rust,偶然发现了Quake III Arena中传奇的InvSqrt()函数,它通过位操作技巧以难以置信的速度计算1/sqrt(x)。在C/C++中,它看起来像这样: ```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) i = 0x5f3759df - ( i >> 1 ); // 魔法常数 y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 一次牛顿迭代 return y; } ``` 问题在于,在Rust中这种直接的指针转换(`*(long*)&y`)被认为是未定义行为(UB)并被禁止。我尝试通过`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) } ```