Avatar ·

هل يمكن تنفيذ الجذر التربيعي العكسي السريع من Quake بلغة Rust؟

مرحباً بالجميع! أنا أدرس Rust وقد صادفت الدالة الأسطورية InvSqrt() من لعبة Quake III Arena، والتي تحسب 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; } ``` المشكلة هي أن مثل هذا التحويل المباشر للمؤشرات (`*(long*)&y`) في Rust يعتبر سلوكاً غير محدد (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)