«هل يمكن في Rust ببساطة كتابة a ** b؟» — قد تسأل و... تخطئ
\n\nإذا أتيت إلى Rust من Python، فإن الصدمة الأولى هي غياب عامل التشغيل **. الصدمة الثانية هي أن المترجم لا يتسامح مع الحريات في الأنواع. الثالثة (الممتعة) — تقدم Rust ترسانة كاملة من الأدوات لرفع الأس، كل منها مصمم خصيصًا لمهمة محددة.
في عام 2025، عندما يحل Rust محل C++ بنشاط في الأنظمة عالية التحميل والتطوير المضمن، أصبح سؤال «How to raise a number to a power?» (الذي حصد آلاف المشاهدات على Stack Overflow) أكثر أهمية. دعنا نفهم مرة واحدة وإلى الأبد: كيفية رفع الأرقام إلى أس بشكل صحيح وسريع وآمن في Rust.
\n\nلماذا لا يوجد عامل تشغيل ** في Rust؟
\n\nRust هي لغة نظامية. لا تسمح بتحميل العوامل بشكل ديناميكي (على الرغم من وجود traits std::ops، لكنها غير موجودة لرفع الأس). بدلاً من ذلك، اقترح المطورون طرقًا-دوال تُبلغ بوضوح عن نوع العملية. هذا يزيل الالتباس بين الرفع الصحيح والحساب العائم.
القاعدة الأساسية: اختر الطريقة وفقًا لنوع البيانات. لا تحاول رفع i32 إلى أس f64 — لن يفهمك المترجم، وإذا فهم (من خلال التحويل)، فإنك تخاطر بفقدان الأداء أو الدقة.
طريقة pow() — ملك الأعداد الصحيحة
\n\nالطريقة الأكثر شيوعًا لأنواع i32 و u64 وغيرها من الأنواع الصحيحة:
fn main() {\n let base: i32 = 5;\n let exponent: u32 = 3;\n let result = base.pow(exponent);\n println!("5^3 = {}", result); // 125\n}\n\nلاحظ: exponent يجب أن يكون دائمًا u32 (بدون إشارة). هذا منطقي — لا يمكن أن يكون الأس سالبًا للأعداد الصحيحة (وإلا ستحصل على كسر).
متى تستخدم: دائمًا للحسابات الصحيحة. يعمل بسرعة، بدون تخصيص ذاكرة، على مستوى تعليمات الآلة.
\n\nماذا لو كان الأس سالبًا؟
\nبالنسبة للأعداد الصحيحة — لا يمكن. لا يدعم Rust الأسس السالبة للأنواع الصحيحة، لأن النتيجة ستكون كسرية. إذا كنت بحاجة إلى 2^-3 — انتقل إلى الأعداد ذات الفاصلة العائمة.
powi() — الخيار المثالي لـ f64 و f32
\n\nتقبل هذه الطريقة أسًا صحيحًا (نوع i32)، ولكنها تعمل مع الأعداد ذات الفاصلة العائمة:
fn main() {\n let base: f64 = 2.0;\n let result = base.powi(-3);\n println!("2.0^-3 = {}", result); // 0.125\n\n // يمكن أيضًا استخدام أس موجب\n let result2 = base.powi(10);\n println!("2.0^10 = {}", result2); // 1024.0\n}\n\nميزة 2025: powi() محسّن للأسس الصحيحة. يستخدم خوارزمية الرفع السريع للأس (exponentiation by squaring). إذا كان الأس ثابتًا أو عددًا صحيحًا، فهذه هي أسرع طريقة لـ f64/f32.
powf() — عندما يكون الأس كسرًا أيضًا
\n\nإذا كان كل من الأساس والأس عددين ذوي فاصلة عائمة، استخدم powf():
fn main() {\n let base: f64 = 9.0;\n let exponent: f64 = 0.5;\n let result = base.powf(exponent);\n println!("9.0^0.5 = {}", result); // 3.0 (جذر تربيعي)\n\n // حالة معقدة\n let base2 = 2.0_f64;\n let exp2 = 3.14_f64;\n println!("2.0^3.14 = {}", base2.powf(exp2)); // ~8.815\n}\n\nهام: powf() تستخدم مكتبة رياضية بطيئة ولكن دقيقة (عادةً libm أو تعليمات الأجهزة). للرسوميات أو الألعاب حيث السرعة مهمة، فكر في استخدام powi().
Crate num — الجندي العالمي
\n\nفي عام 2025، يقدم نظام Rust البيئي crate num (و num-