الأعداد العشرية العائمة
| English | العربية |
|---|---|
| floating-point/ˈfləʊtɪŋ pɔɪnt/ | نقاط عائمة |
| mantissa/mænˈtɪsə/ | المقام |
| exponent/ekˈspəʊnənt/ | الأس |
| normalised/ˈnɔːməlaɪzd/ | منظم |
| precision/prɪˈsɪʒn/ | الدقة |
| rounding errors/ˈraʊndɪŋ ˈerəz/ | أخطاء التقريب |
| fixed-point/fɪkst pɔɪnt/ | نقاط ثابتة |
| overflow/ˌəʊvəˈfləʊ/ | الانحياز (overflow) |
| underflow/ˌʌndəˈfləʊ/ | انحدار |
صاروخ فاتته مسافة 600 متر
- في 25 فبراير 1991، فشل نظام باتريوت في الدمام في اصطياد صاروخ قادم. مات 28 جندياً.
- كان النظام يعد الوقت بأجزاء من العشر من الثانية، و 0.1 ليس له تمثيل ثنائي دقيق: هو كسر متكرر، مقصوص لطول المسجل. فقدت كل نبضة جزءاً من الميكروثانية.
- بعد مائة ساعة عمل، بلغ الخطأ المتراكم ثلث ثانية، وفي ثلث ثانية تحرك الهدف 600 متر. كانت الحسابات صحيحة في كل خطوة على حدة.
- هذه الدرس هي تنسيق الأعداد العشرية العائمة (floating-point)، التطبيع، وأخطاء التقريب التي تجعل مثل هذه الحالات ممكنة.
التنسيق
- لتخزين أعداد حقيقية ذات أحجام مختلفة جداً، يستخدم الكمبيوتر صيغة علمية ثنائية بمجالين: جزء عشري (mantissa)، وهو الأرقام المعنوية، وأس (exponent)، وهو قوة 2 للضرب بها. يتم تخزين كليهما بصيغة مكملة الثنائية (two's complement).
- اقرأ الجزء العشري ككسر ثنائي: البت الأول بعد الفاصلة قيمته $\tfrac12$، التالي $\tfrac14$، ثم $\tfrac18$. وهكذا
0.1010000هو $\tfrac12 + \tfrac18 = 0.625$. - مع الأس
00000010، أي $+2$، تكون القيمة $0.625 \times 2^2 = 2.5$.

كسر وقوة من اثنين
بناء عدد عشري عائم
قلب بتات المقام والمُدرَج لصنع قيمة، والتحقق مما إذا كانت مُعدَّلة.
يُخزن العدد العشري العائم كـ:
value = mantissa × 2^exponent — تدوين علمي ثنائي، مع تخزين كلا الجزأين بمتمم الاثنين.
طابق كل جزء من تمثيل العدد العشري العائم بدوره.
value = mantissa × 2^exponent؛ التعديل يزيد الدقة؛ النقود تستخدم النقاط الثابتة/BCD لتفادي التقريب.
مثال محلول: تحويل من ثنائي إلى عشري
- عدد له جزء عشري
10110000وأس00000011. أوجد قيمته العشرية. - الأس هو $+3$. المانيسا تبدأ بـ 1، لذا فهي سالبة وتُقرأ وفقاً لقواعد المتمم الثاني: كـ
1.0110000قيمة بت الإشارة هي $-1$ وبتات الكسر تضيف $\tfrac14 + \tfrac18 = 0.375$، إذن المانيسا هي $-1 + 0.375 = -0.625$. - $\text{number} = -0.625 \times 2^3 = -5.0$.
- الخطأ الأكثر شيوعاً هو قراءة مانيسا سالبة وكأنها موجبة. تحقق من البت الأول قبل أي شيء آخر.
عدد عشري عائم له مقام 10110000 ومُدرَج 00000011. ما قيمته العشرية؟
المقام يبدأ بـ 1، لذا فهو سالب: −1 + 1/4 + 1/8 = −0.625. ضرب 2^3 يعطي −5.0. قراءته كموجب هو الخطأ المعتاد.
مثال محلول: العشري إلى الثنائي
- احفظ $+2.5$ في نفس تنسيق الفاصلة العائمة المكون من 8 بت للجزء الكسري (mantissa) و8 بت للأس (exponent).
- في النظام الثنائي، $2.5 = 10.1$. يُكتب ككسر مضروباً في قوة من اثنين: $2.5 = 0.101 \times 2^2$.
- إذن المانيسا هي
01010000، بت إشارة 0 ثم.101مملوء بالأصفار، والأس هو00000010. - اكتبه دائماً بالصيغة المقيّدة أولاً؛ حينها تُقرأ الحقول مباشرة.
مكتوبة لكسر مُعدَّل مضروب في قوة من اثنين، 2.5 = 0.101 x 2^__. أعطِ المُدرَج.
2.5 هي 10.1 في النظام الثنائي؛ تحريك الفاصلة مكانين لليسار يعطي 0.101، لذا المُدرَج هو 2 والمقام هو 01010000.
التطبيع
- يكون العدد مقيَّداً عندما يقع أول بت معنوي فوراً بعد الفاصلة الثنائية، بحيث لا توجد أصفار بادئة مهدرة. للعدد الموجب تبدأ المانيسا بـ
0.1؛ وللسالب بـ1.0. - السبب: إنها تعظم الدقة، لأن كل بت في المانيسا يحمل معلومات بدلاً من صفار بادئة.
- لتقييد العدد، أزل المانيسا لليسار وقلل الأس بنفس عدد الخانات، أو أزل لليمين وزده. القيمة لا تتغير؛ فقط تمثيلها.

أزل البتات، عدّل الأس، احتفظ بالقيمة
التبادل بين بتات المانيسا وبات الأس
- العدد الكلي للبتات ثابت، لذا يتنافس الحقلان.
- زيادة بتات المانيسا تعني دقة أكبر: يُخزن كل قيمة بدقة أكبر، مع خطأ تقريب أصغر.
- زيادة بتات الأس تعني مدى أكبر: يمكن تمثيل كميات كبيرة وصغيرة جداً، لكن بدقة أقل لكل منها.
- السؤال الذي يطلب تأثير نقل بت من حقل إلى الآخر يقصد هذا التبادل تحديداً: المدى مقابل الدقة.
تعديل عدد عشري عائم
مرر بخطوات التعديل. نقل المقام لإزالة الأصفار الرائدة المهدرة — وضبط المُدرَج للمطابقة — يحافظ على القيمة نفسها لكن يستهلك كل بت للدقة.
تعديل عدد عشري عائم:
التعديل ينقل المقام بحيث يلي الفاصلة الثنائية أول بت مهم — وبالتالي يحمل كل بت معلومات، والقيمة دون تغيير.
أي مما يلي صحيح بخصوص تعديل العدد العشري العائم؟ حدّد كل ما ينطبق.
التعديل يغير التمثيل فقط. القيمة دون تغيير؛ وهذا ما يضمنه ضبط المُدرَج.
التقريب وعواقبه
- العديد من الأعداد الحقيقية العشرية لا يمكن تخزينها بدقة في النظام الثنائي. $0.1$ هو الكسر المتكرر $0.000110011\ldots$، لذا يجب قصه: القيمة المخزنة قريبة من $0.1$ لكنها لا تساويها أبداً.
- أخطاء التقريب تتراكم عبر عمليات متعددة، ولهذا
0.1 + 0.2ليست بالضبط0.3ولماذا انحرقت ساعة نظام باتريوت. - لذا لا تقارن أبداً عددين حقيقيين بالمساواة: اكتب
ABS(x - 0.3) < 1e-9بدلاً منx = 0.3. واحذر طرح قيمتين متقاربتين جداً، مما يفقد معظم البتات المعنوية. - للقيم التي يجب أن تكون دقيقة، والعملات على وجه الخصوص، استخدم النقاط الثابتة أو BCD بدلاً من ذلك.
طابق كل تغيير في تخصيص البتات بتأثيره.
حجم الكلمة ثابت، لذا تتنافس الدقة والنطاق ضد بعضهما البعض؛ الانهيار والانحدار هما نفاد مجال المُدرَج في كل طرف.
الزيادة تحت الحد والنقصان عنه
- الزيادة تحت الحد (Overflow) تحدث عندما يكون الناتج كبيراً جداً لنطاق الأس، sehingga لا يمكن تمثيله على الإطلاق.
- النقصان عن الحد (Underflow) يحدث عندما يكون الناتج صغيراً جداً، sehingga قريباً من الصفر لدرجة أن الأس لا يمكن أن ينخفض بما يكفي، ويُقرب إلى صفر.
- كلاهما خاصيتان لـ حجم حقل الأس، وهو النصف الآخر من التبادل المذكور أعلاه.
0.1 لا يمكن تخزينه بدقة في النظام الثنائي (هو كسر دوري)، لذا 0.1 + 0.2 لا يعطي 0.3 بالضبط على الكمبيوتر.
تتجمع أخطاء التقريب الصغيرة — ولهذا تُعالَج النقود بالنقاط الثابتة أو BCD، وليس بالأعداد العائمة.
لعمليات الحساب النقدية الدقيقة يجب أن تستخدم:
أخطاء تقريب الأعداد العائمة غير مقبولة للمعاملات المالية؛ فالنقاط الثابتة أو BCD تخزن القيم العشرية بدقة.
علامات ضائعة
- المانيسا هي كسر، وليست عدداً صحيحاً: البت الأول بعد الفاصلة يمثل النصف.
- المانيسا التي تبدأ بـ 1 هي سالبة وتتبع قواعد المتمم الثاني. تحقق من هذا البت أولاً.
- التقييد يعظم الدقة؛ لا يغير القيمة، ولا يجعل العدد أكبر.
- زيادة المانيسا تعني دقة، زيادة الأس تعني مدى. الزيادة تحت الحد تعني كبيراً جداً، والنقصان عن الحد يعني صغيراً جداً.
لقد فهمت الأمر
- النقاط العائمة تخزن $\text{mantissa} \times 2^{\text{exponent}}$، وكلاهما بالمتمم الثاني؛ المانيسا هي كسر ثنائي
- التحويل بقراءة المانيسا ككسر (متمم الثاني إذا بدأت بـ 1) وضربه في اثنين مرفوع للأس
- مقيَّد يعني أن أول بت معنوي فوراً بعد الفاصلة، مما يعظم الدقة؛ الإزاحة لليسار تخفض الأس
- زيادة بتات المانيسا تعطي دقة، زيادة بتات الأس تعطي مدى؛ لا يستطيع النظام الثنائي تخزين الكثير من الأعداد الحقيقية بدقة، لذا توقع أخطاء تقريب، وقارن بتسامح، واستخدم النقاط الثابتة أو BCD للعملات