علوم وفضاء

float_power: هل تقبل الأس السالب مع مدخلات صحيحة؟

مدخلات صحيحة ونتائج عائمة.
رسم أصلي لتشغيل موثق.

float_power ترقي المدخلات الصحيحة عند الرفع إلى القوة. [1] نختبر أُسُسًا سالبة ونقارن استدعاء power بالمدخلين نفسيهما.

اقرأ سياسة الدالة

تقوم float_power بالرفع إلى القوة لكل عنصر، مع ترقية المدخلات الصحيحة إلى نوع عائم. [1]

نثبت في تجربتنا مدخلين من int32 ثم نغير الدالة وحدها. السؤال ليس هل للكسر 1/4 معنى رياضي، بل هل ينتج الاستدعاء الذي اخترناه قيمة، وما نوع هذه القيمة في تشغيلنا.

هذه أعداد تعليمية مؤلفة وليست بيانات قياس. لا نستخدم نتيجة هذا المثال لتقدير خطأ علمي أو سرعة برنامج، ولا نفترض أن التحويل إلى العائم يحفظ كل عدد صحيح مهما كبر.

قارن استدعاءين بالمدخلين نفسيهما

توضح وثائق power أن رفع نوع صحيح إلى أُس صحيح سالب يثير ValueError. [2]

أنشأنا b=np.array([4,-2,8],dtype=np.int32)، وe=np.array([-1,-3,2],dtype=np.int32). شكل كل مصفوفة (3,). لم نستخدم out أو where أو اختيار dtype صريح للناتج.

استدعينا np.float_power(b,e). ظهرت القيم 0.25 و−0.125 و64.0 في مصفوفة float64، وبقي الشكل (3,). وجود المدخلين من int32 لم يجعل خرج هذا الاستدعاء من int32.

ثم استدعينا np.power(b,e) بالمدخلين نفسيهما؛ ظهر ValueError. لم نحصل من هذا الاستدعاء على مصفوفة نتائج لكي نقرأ العنصر الثالث منها، حتى وإن كان الأُس الثالث موجبًا.

حفظنا بايتات b وe قبل الاستدعاءات وبعدها، ووجدناها متساوية. هذا فحص لعدم تغيير المدخلين في التجربة؛ لا نفحص به مشاركة الذاكرة أو السلوك مع مصفوفة إخراج نقدمها بأنفسنا.

راجع الكسور والتحكم الموجب

حسبنا مرجعًا مستقلًا باستخدام fractions.Fraction. للزوج الأول 4**−1 يساوي 1/4، أي 0.25. وللثاني (−2)**−3 يساوي 1/(−8)، أي −1/8 أو −0.125. للثالث 8**2 يساوي 64.

بذلك لا تجعل إشارة الأُس السالبة نتيجة الزوج الأول سالبة؛ هي موجبة في هذا الحساب. أما سالب الزوج الثاني فيبقى في مقلوب قوة فردية للأساس السالب. نكتب الأقواس حتى يظهر الأساس الذي رفعناه.

نراجع أيضًا أن 4**−1 ليس −4 أو صفرًا في مثالنا، وأن (−2)**−3 ليس −6. هذه قيم محسوبة للمدخلات المختارة، وليست افتراضًا أن المكتبة تعيد كل كسر بلا تقريب.

أجرينا استدعاءً مستقلًا على b[2:] وe[2:]، أي مصفوفتين من عنصر واحد تحملان 8 و2. أعادت np.power هاتين المصفوفتين إلى ناتج بقيمة 64 ونوع int32 في التشغيل المحدد.

في المقابل، العنصر الثالث في ناتج float_power الكامل يحمل القيمة 64.0 ضمن مصفوفة float64. تساوي القيمة لا يوحد نوع المصفوفة؛ نفصل في سجل النتيجة بين الرقم والنوع والاستدعاء الذي أنتجه.

هذا التحكم الجديد لا يحول فشل الاستدعاء الكامل السابق إلى نجاح جزئي. استخدمنا مدخلين جديدين مقتطعين واستدعاءً جديدًا، ونسجله بهذه الصفة.

استدعاءان والمدخلان نفسيهما.
رسم أصلي لتشغيل موثق.

حدد نطاق الفحوص

استخدمنا ثماني قيم أساس غير صفرية: −8 و−4 و−2 و−1 و1 و2 و4 و8. لكل أساس قابلنا تسع قيم صحيحة للأُس، من −4 إلى 4. عدد الحالات 8×9=72، ومصفوفتا كل حالة من عنصر واحد وبنوع int32.

حسبنا المرجع Fraction(b)**n ثم حولناه إلى float. النتائج المختارة من قوى اثنين أو مقلوبها، وقيمها صغيرة وممثلة بدقة ضمن هذه التجربة. المرجع لا يستدعي دالتي القوة في NumPy.

لكل حالة خمسة فحوص: قيمة float_power مقابل المرجع، ونوع الناتج وشكله معًا، وثبات بايتات المدخلين بعده، وسلوك power، وثبات بايتات المدخلين بعد power. جمعنا فحصي ثبات المدخلين في بند واحد عند عد الفحوص.

حين كان الأُس سالبًا ظهر ValueError من power في الشبكة. وحين كان غير سالب، قارنا قيمته بمرجعنا الصحيح ونوعه بـint32. القيم المختارة في الفرع الأخير لا تتجاوز 4096 في المقدار.

إجمالي الشبكة 72×5=360. أضفنا ستة تحكمات للمثال الثلاثي: قيم float_power، ونوعه وشكله، وثبات المدخلين بعده، وخطأ power، وثبات المدخلين بعد الخطأ، ونتيجة التحكم الموجب ونوعها. صار الإجمالي 366 ومرت جميع الفحوص.

لم نفحص أساسًا صفريًا مع أُس سالب أو قيم أُس كسرية أو مدخلات مركبة، ولا أنواعًا أخرى أو اختلاف الأشكال أو out وwhere أو الفائض والاضمحلال العددي أو الذاكرة والأداء. لا يثبت النجاح هنا دقة جميع القوى أو سياسة مناسبة لبيانات أخرى.

الاستدعاءالمدخلالنتيجةنوع الناتج
float_powerالأزواج الثلاثة0.25؛ −0.125؛ 64float64
powerالمدخلان الكاملان نفسيهماValueErrorلا مصفوفة نتائج
powerالزوج 8 و2 وحده64int32

للتوسع: الأسس النسبية.

المراجع

  1. NumPy 2.3 — float_power
  2. NumPy 2.3 — power

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.