رفع الأس في Rust: أفضل الممارسات لعام 2025 (وليس Python)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

«هل يمكن في Rust ببساطة كتابة a ** b؟» — قد تسأل و... تخطئ

\n\n

إذا أتيت إلى Rust من Python، فإن الصدمة الأولى هي غياب عامل التشغيل **. الصدمة الثانية هي أن المترجم لا يتسامح مع الحريات في الأنواع. الثالثة (الممتعة) — تقدم Rust ترسانة كاملة من الأدوات لرفع الأس، كل منها مصمم خصيصًا لمهمة محددة.

\n\n

في عام 2025، عندما يحل Rust محل C++ بنشاط في الأنظمة عالية التحميل والتطوير المضمن، أصبح سؤال «How to raise a number to a power?» (الذي حصد آلاف المشاهدات على Stack Overflow) أكثر أهمية. دعنا نفهم مرة واحدة وإلى الأبد: كيفية رفع الأرقام إلى أس بشكل صحيح وسريع وآمن في Rust.

\n\n

لماذا لا يوجد عامل تشغيل ** في Rust؟

\n\n

Rust هي لغة نظامية. لا تسمح بتحميل العوامل بشكل ديناميكي (على الرغم من وجود traits std::ops، لكنها غير موجودة لرفع الأس). بدلاً من ذلك، اقترح المطورون طرقًا-دوال تُبلغ بوضوح عن نوع العملية. هذا يزيل الالتباس بين الرفع الصحيح والحساب العائم.

\n\n

القاعدة الأساسية: اختر الطريقة وفقًا لنوع البيانات. لا تحاول رفع i32 إلى أس f64 — لن يفهمك المترجم، وإذا فهم (من خلال التحويل)، فإنك تخاطر بفقدان الأداء أو الدقة.

\n\n

طريقة pow() — ملك الأعداد الصحيحة

\n\n

الطريقة الأكثر شيوعًا لأنواع i32 و u64 وغيرها من الأنواع الصحيحة:

\n\n
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\n

ماذا لو كان الأس سالبًا؟

\n

بالنسبة للأعداد الصحيحة — لا يمكن. لا يدعم Rust الأسس السالبة للأنواع الصحيحة، لأن النتيجة ستكون كسرية. إذا كنت بحاجة إلى 2^-3 — انتقل إلى الأعداد ذات الفاصلة العائمة.

\n\n

powi() — الخيار المثالي لـ f64 و f32

\n\n

تقبل هذه الطريقة أسًا صحيحًا (نوع i32)، ولكنها تعمل مع الأعداد ذات الفاصلة العائمة:

\n\n
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.

\n\n

powf() — عندما يكون الأس كسرًا أيضًا

\n\n

إذا كان كل من الأساس والأس عددين ذوي فاصلة عائمة، استخدم powf():

\n\n
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().

\n\n

Crate num — الجندي العالمي

\n\n

في عام 2025، يقدم نظام Rust البيئي crate num (و num-

المدونات

توصيات الكتب