علوم وفضاء

rint: هل يصبح نوع المصفوفة صحيحًا بعد التقريب؟

خمسة عناصر في ثلاثة مسارات.
رسم أصلي لنتائج التشغيل.

تقرب rint إلى أقرب عدد صحيح. [1] نفحص القيمة والنوع.

افصل القيمة عن النوع

rint تقرب للأقرب، وللزوجي عند التعادل؛ وastype تعيد مصفوفة محولة لنوع محدد. [1] [2]

سؤالنا عن سجل الناتج نفسه: هل كتابة 4.0 في المصفوفة تكفي للقول إن نوعها int32؟ نسجل القيم، وdtype، وshape كلًا على حدة، ثم نقارن ثلاثة استدعاءات على مدخل واحد.

نحصر التجربة في مصفوفة float64 صغيرة. لا نستخدم صياغة الوثائق عن نوع الخرج لبناء قاعدة تشمل جميع أنواع المدخلات؛ الدليل هنا هو نوع الناتج الذي سجلناه في بيئتنا.

شاهد الناتج قبل التحويل

أنشأنا x=np.array([-5.5,-4.5,3.5,4.5,5.75],dtype=np.float64). استخدمنا r=np.rint(x) دون اختيار out أو where أو dtype للناتج. كانت البيئة NumPy 2.3.5 وCPython 3.12.14.

سجلنا r.tolist() بالقيم [-6.0,-4.0,4.0,4.0,6.0]، مع dtype=float64 وshape=(5,). فالقيمة 4.0 تساوي أربعة عدديًا، لكن وصف المصفوفة في هذا التشغيل بقي float64.

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

هذه النتيجة تخص المدخل المعلن. لم نشغّل rint بمدخل int32 أو نوع عائم آخر، ولا نثبت بهذا المثال كيف تختار المكتبة النوع لكل استدعاء ممكن.

قارن مسارين ثم احسب المرجع

شغّلنا a=x.astype(np.int32) على المدخل الأصلي، فسجلنا [-5,-4,3,4,5] ونوع int32. وشغّلنا b=r.astype(np.int32) على الناتج المقرب، فسجلنا [-6,-4,4,4,6] ونوع int32.

في الموضع الأول اختلف −5 عن −6، وفي الثالث اختلف 3 عن 4، وفي الأخير اختلف 5 عن 6. أما الموضعان الثاني والرابع فتساويا بين المسارين. تساوي بعض المواضع لا يجعل المصفوفتين متساويتين.

حسبنا التقريب المرجعي بكسور Fraction. إذا كان q=n/d وd موجبًا، نأخذ lo=n//d وrem=n−lo×d. نقارن 2×rem مع d: الأصغر يختار lo، والأكبر يختار lo+1، وعند المساواة نختار الزوجي من الجارين.

عند −5.5 يكون الجاران −6 و−5، فنختار −6؛ وعند −4.5 نختار −4. وعند 3.5 و4.5 نختار 4 في الحالتين. أما 5.75 فيعطي lo=5 وباقيًا 3 من مقام 4؛ لذلك يكون الناتج 6.

مرجع المسار المباشر مختلف: نأخذ إشارة الكسر ونضربها في abs(n)//d. هكذا أعطت القيم المختارة −5 و−4 و3 و4 و5. هذه مقارنة مستقلة لنتائجنا الصغيرة، ولا تقترح تحويل قيم خارج مجال int32.

حفظنا بايتات x قبل تشغيل المسارات وبعدها ووجدناها متساوية. لم نفحص مشاركة الذاكرة بين المصفوفات، ولا نستخدم ثبات المدخل كدليل على تلك المشاركة.

المدخل والنوع الناتج في كل مسار.
رسم أصلي لنتائج التشغيل.

اعرف حدود الفحوص

اختبرنا قيم k/4، حيث k عدد صحيح من −32 إلى 32 شاملًا الطرفين. عدد القيم 65، وهي أرباع دقيقة من −8 إلى 8. أنشأنا لكل قيمة مصفوفة float64 بعنصر واحد، وقارنا الاستدعاءات الثلاثة.

في كل حالة راجعنا خمسة أشياء: قيمة rint مقابل المرجع الكسري؛ ونوع خرجها float64 وشكله (1,)؛ وقيمة التحويل المباشر ونوعه int32 وشكله؛ وقيمة التحويل بعد التقريب ونوعه وشكله؛ وثبات بايتات المدخل.

عدد فحوص الشبكة 65×5=325. أضفنا خمسة للمثال ذي العناصر الخمسة: قيم rint؛ ونوعها وشكلها؛ وقيم التحويل المباشر ونوعه؛ وقيم التحويل بعد التقريب ونوعه؛ وثبات المدخل. صار الإجمالي 330 ومرت جميعها.

مرجع التقريب يستخدم القسمة والباقي والزوجية في Fraction؛ ومرجع الاتجاه نحو الصفر يستخدم الإشارة والقسمة الصحيحة. لا يستدعي المرجع Python round أو دوال تقريب وتحويل NumPy، والأرباع المختارة ممثلة بدقة في float64.

لا يشمل النطاق مدخلًا صحيح النوع إلى rint، أو أنواعًا أخرى، أو تحويل المتغيرات المفردة، أو NaN وinf والقيم الضخمة، أو سلوك القيم خارج مجال النوع المطلوب. ولا نفحص تقريب نص عشري أو بت إشارة الصفر أو الذاكرة والأداء. الأمثلة مؤلفة للتعليم؛ نستنتج منها نتائج الاستدعاءات المعلنة فقط.

x / float64rint / float64تحويل مباشر / int32تقريب ثم تحويل / int32
−5.5−6.0−5−6
−4.5−4.0−4−4
3.54.034
4.54.044
5.756.056

للتوسع: تقريب الأعداد.

المراجع

  1. NumPy 2.3 — rint
  2. NumPy 2.3 — ndarray.astype

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