نقارن جزأي modf بباقي remainder على واحد. [1] [2]
حدد عمليتي المقارنة
لـmodf جزآن بإشارة المدخل؛ وremainder مرتبطة بالقسمة للأسفل وإشارة القاسم. [1] [2]
نثبت القاسم في تحكمنا عند 1.0، ونسجل خرج modf الأول باسم f والثاني باسم i. لا نقارن ناتج قسمة عشرية عامة بباقي صحيح لقاسم آخر؛ كل صف يبدأ بالقيمة نفسها في التشغيلين.
الأرقام أمثلة مؤلفة. سؤالنا عن الناتج الكسري السالب في مصفوفة NumPy، وعن بديله المحتمل عند استعمال remainder على واحد.
احفظ جزأي modf
أنشأنا x=np.array([-3.75,-1.25,0,4.625],dtype=np.float64)، ثم f,i=np.modf(x)، في NumPy 2.3.5 على CPython 3.12.14. لم نستخدم out أو where أو اختيار dtype للناتج.
سجلنا f بالقيم [-0.75,-0.25,0.0,0.625]، وسجلنا i بالقيم [-3.0,-1.0,0.0,4.0]. كان نوع كل منهما float64 وشكله (4,). كلمة «الصحيح» هنا تصف قيمة الجزء المسجل، ولا تعني تحويل المصفوفة إلى int32.
في −3.75 يعطينا الموضع الأول −0.75 و−3.0. وفي −1.25 يعطينا −0.25 و−1.0. لم نقلب إشارة الجزء الكسري إلى موجب عند نقله إلى الجدول أو الصورة.
عرضنا الصفر عددًا يساوي صفرًا. بعض أصفار شبكة التشغيل قد تختلف إشارتها في التمثيل؛ لم نفحص بتاتها ولا نعتمد على علامة الصفر في استنتاجنا.
قارن الباقي وراجع إعادة التركيب
شغّلنا r=np.remainder(x,1.0). سجلنا [0.25,0.75,0.0,0.625]، ونوع float64 وشكل (4,). لم تكن القيمة الأولى −0.75، ولم تكن الثانية −0.25؛ اتفق الخرج مع f في الصفر والعدد الموجب المختارين.
نراجع −3.75 بالكسر −15/4. مرجع الجزء الصحيح نحو الصفر هو −3، ويبقى −15/4−(−3)=−3/4. هكذا نجمع −3+(−3/4)=−15/4.
أما مرجع القسمة للأسفل على واحد فيختار −4، فيبقى −15/4−(−4)=1/4. ولذلك −4+1/4 يعيد −15/4 أيضًا. المساواة وحدها لا تجعل 1/4 هو الكسر الذي أعاده الاستدعاء الأول.
لـ−1.25، أي −5/4، يختار مرجع الفصل −1 ويبقى −1/4؛ ويختار مرجع القسمة −2 ويبقى 3/4. وفي 4.625، أي 37/8، يختار المرجعان 4 ويبقى 5/8.
أعطى f+i القيم الأصلية بالضبط عدديًا في المثال الرباعي. تحقق هذا الجمع لا يسمح باستبدال f بالباقي r مع إبقاء i: مثلًا −3+0.25=−2.75، وهو ليس مدخلنا −3.75.
هذه الحسابات المرجعية لا تدعي أننا شغّلنا floor_divide أو divmod. نفذنا modf وremainder والجمع المعلن فقط، وحسبنا الخارجين المرجعيين بصورة مستقلة.

وسع الفحص ضمن نطاق معلوم
أخذنا q=Fraction(k,8)، حيث k صحيح من −64 إلى 64 شاملًا الطرفين. لدينا 129 قيمة من −8 إلى 8 بفواصل ثمن. أنشأنا لكل قيمة مصفوفة float64 بعنصر واحد.
مرجع الجزء الصحيح هو إشارة الكسر مضروبة في abs(numerator)//denominator؛ ثم نطرح ذلك الصحيح من q للحصول على الجزء الكسري. وللباقي على واحد نطرح من q خارج numerator//denominator، وهو مرجع القسمة للأسفل.
لا يستدعي المرجع math.modf أو دوال modf أو floor أو trunc أو remainder في NumPy، ولا عملية الباقي على Fraction. الأثمان المختارة صغيرة وممثلة بدقة في float64، لذا استعملنا مساواة عددية مباشرة.
لكل حالة ستة فحوص: قيمة f؛ وقيمة i؛ ونوع الخرجين وشكلهما معًا؛ وقيمة r ونوعها وشكلها؛ وإعادة f+i إلى المدخل؛ وثبات بايتات x. الشبكة أعطت 129×6=774 فحصًا.
أضفنا ستة تحكمات للمثال الرباعي بالفئات نفسها؛ صار الإجمالي 780 ومرت جميعها. حفظ فحص البايتات المدخل قبل الاستدعاءات وبعدها؛ ولم يختبر مشاركة الذاكرة بين المخرجات.
لا يشمل النطاق مدخلات صحيحة النوع أو أنواعًا عائمة أخرى أو متغيرات مفردة، ولا NaN أو اللانهاية أو القيم الضخمة أو قواسم غير واحد. ولم نفحص اختلاف الأشكال أو خيارات الإخراج أو بتات الصفر أو الأداء. نتيجة المثال مرتبطة بالنوع والإصدار والعمليات المسجلة.
| x / float64 | f / float64 | i / float64 | remainder(x,1.0) / float64 |
|---|---|---|---|
| −3.75 | −0.75 | −3 | 0.25 |
| −1.25 | −0.25 | −1 | 0.75 |
| 0 | 0 | 0 | 0 |
| 4.625 | 0.625 | 4 | 0.625 |
للتوسع: القسمة الإقليدية.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
