مجال int8 ونتيجة الجمع يوضحان الفرق بين صحة الحساب وقدرة نوع التخزين على تمثيل الناتج. قد تدخل القيمتان الأصليتان في المجال بينما يخرج مجموعهما منه. نختار جمعا بسيطا كي نراجع الحد قبل أن نكتب رقما في حقل يستخدم مع بيانات الذكاء الاصطناعي.
الخلاصة السريعة
ليس دائما؛ 120 و 20 داخل مجال int8 ، لكن مجموعهما 140 أكبر من حده الأعلى 127 ، فلا يمثله هذا النوع بالقيمة نفسها.
- يوثق NumPy نوع int8 ذا 8 بتات بإشارة، وuint8 ذا 8 بتات دون إشارة. وتعرض iinfo حدود النوع. [1][2]
- نحسب مجال التمثيل المعلن: int8 من−128 إلى 127 ، وuint8 من 0 إلى 255 ؛ كلاهما 256 قيمة صحيحة متاحة، مع توزيع مختلف للمجال.
- الجمع الرياضي 120+20=140 خارج مجال int8 وداخل مجال uint8. دخول كل مدخل وحده لا يثبت دخول الناتج.
- المقارنة لا تعلن ناتج تحويل أو التفاف أو خطأ وقت تشغيل. راجع النوع الفعلي للعملية والنتيجة والوسائط؛ لم نستدع NumPy، ولا يجعل uint8 كل حساب صالحا.
ماذا يعني وجود الإشارة؟
تصف وثائق الأنواع int8 بأنه صحيح ذو 8 بتات بإشارة، وuint8 بأنه صحيح ذو 8 بتات دون إشارة. [1] وتوفر iinfo الحدين الأدنى والأعلى للنوع المطلوب. [2]
نقصد الإشارة التي تتيح قيما سالبة في النوع الأول؛ النوع الثاني يخصص مجاله للأعداد غير السالبة. لا نستعمل الرقم 8 لتقول إن كل قيمة من ثمانية أرقام عشرية تدخل فيه؛ البت خانة ثنائية وليس رقما عشريا.
في التمثيل المعلن يوجد 2 أس 8 ، أي 256 نمطا. نكتب مجال int8 من سالب 2 أس 7 إلى 2 أس 7 ناقص 1 ، فيكون−128 إلى 127. ولنوع uint8 يكون المجال من 0 إلى 2 أس 8 ناقص 1 ، أي 255. هذان مجالا تخزين، لا وحدتا قياس أو درجتا جودة.
كيف يدخل المدخلان ويخرج المجموع؟
نؤلف القيمتين 120 و 20. كل منهما بين−128 و 127 ، لذلك تدخلان المجال الأول منفردتين. نجمعهما رياضيا فنحصل على 140 ؛ وهذا يزيد على 127 بمقدار 13 ، فلا يوجد في المجال نفسه موضع يساوي 140.
أما 140 فهو بين 0 و 255 ، فيدخل مجال uint8 من حيث هذه المقارنة فقط. لم نغير حقيقة الجمع من أجل النوع؛ بقي 120+20=140. الذي اختلف هو مجموعة الأعداد التي يستطيع التمثيل أن يحملها.
ولا نكتب في هذا المقال نتيجة فعلية لجمع نوعين في مكتبة. لا نعرف من المقارنة وحدها هل اختير نوع أوسع للعملية أو وقع تحويل أو صدر خطأ؛ هذه تفاصيل تنفيذ تحتاج عقدا منفصلا عن المجال.
| القيمة الرياضية | داخل int8 ؟ | داخل uint8 ؟ |
|---|---|---|
| 120 | نعم | نعم |
| 20 | نعم | نعم |
| 140 ؛ مجموعهما | لا | نعم |
| سالب 1؛ حالة أخرى | نعم | لا |
هل عدد القيم المتاحة يعني اتساعا أكبر؟
في مجال int8 نحسب 127−(−128)+1=256 قيمة صحيحة. وفي مجال uint8 نحسب 255−0+1=256. العدد متساو، لكن مواقعه مختلفة؛ التخلي عن السالب يسمح في عقدنا بحد موجب أعلى دون زيادة عدد البتات.
لذلك لا نسمي uint8 أفضل لكل عمود. إذا احتاجت البيانات إلى−1 ، فهذه القيمة تدخل int8 ولا تدخل uint8. المثال الآخر لا يوصي بتغيير نوع بيانات فعلية؛ إنه يبين ما يجب معرفته عن معنى الحقل قبل اختيار مجال.
ماذا نفحص قبل حفظ نتيجة؟
نقترح تحديد نوع المدخلات ونوع الحساب الوسيط ونوع الناتج المحفوظ، ثم فحص المجال لكل قيمة تحتاج أن تبقى كما هي. قيمة نهائية صغيرة لا تضمن أن كل حساب وسيط سابق كان داخل مجاله، كما أن مدخلات صغيرة لا تضمن مجموعا صغيرا.
إذا احتاجت المهمة إلى 140 ، فلا نستبدلها بقيمة أخرى ثم نسمي ذلك حفظا للمجموع الصحيح. نختار تمثيلا ملائما بعد مراجعة العقد الفعلي. لم ننفذ جمعا أو تحويلا أو ندرب نموذجا؛ المقال يثبت حد المجال الذي يجب أن يبقى واضحا في هذه المراجعة.
المصادر ومتابعة القراءة
- NumPy: numerical data types (يفتح في نافذة جديدة)numpy.org
- NumPy: iinfo (يفتح في نافذة جديدة)numpy.org
أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.
