الحساب الصحيح. اقسم بتقريب النتيجة. الجزء الأول

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

لماذا لا يهتم المبرمجون التطبيقيون بتعقيدات الحساب في ظل ظروف مثل هذا الحساب ، سؤال. سأجرؤ فقط على اقتراح أنه في جميع الاحتمالات ، تؤثر عادة إجراء الحسابات على الآلة الحاسبة ... على أي حال ، وبانتظام يحسد عليه ، "لدي السعادة" لنرى كيف يخطو الزملاء في المتجر على نفس أشعل النار. تهدف هذه المادة إلى تحييد نفس "أشعل النار".

في الحساب الصحيح ، تتكون نتيجة قسمة عدد صحيح على آخر من رقمين - القسمة والباقي. إذا تخلصنا من باقي القسمة ، نحصل على النتيجة ، بالقيمة المطلقة ، مقربًا إلى عدد صحيح أصغر.

تحقيق الحسابات بالكسور ، غالبًا ما يتم تجاهل هذه اللحظة ، وبعد أن غاب عنها ، فإنها تتلقى خسائر في دقة الحسابات. علاوة على ذلك ، تنخفض دقة الحسابات مع زيادة قيمة المقسم. على سبيل المثال ، أن 53/13 ، أن 64/13 سيؤدي إلى 4 ، على الرغم من أن حاصل قسمة الكسر الثاني أقرب إلى 5.
في الواقع ، تقريب النتيجة إلى أقرب كل شيء سهل التنظيم. للقيام بذلك ، يكفي مضاعفة ما تبقى من القسمة عن طريق تلخيصه مع نفسه ، ثم قسمةه مرة أخرى على نفس العدد الذي تم تقسيمه في البداية ، وإضافة حاصل القسمة إلى القسمة التي تم الحصول عليها من عملية القسمة الأولية.
في المثال البسيط الأول ، سأوضح كيفية تنفيذ هذا التقريب في البرمجيات باستخدام مثال حساب نسبة كميتين

Y=k=A/B


مع الأخذ في الاعتبار حقيقة أن مثل هذه الحسابات في البرنامج قد تكون مطلوبة بشكل متكرر ، نقوم بتنفيذ خوارزمية الحساب بتنسيق مناسب للتعبئة في برنامج فرعي.

من أجل التنفيذ الصحيح للحسابات الوسيطة اللازمة لذلك ، ستكون هناك حاجة إلى مجموعة من خمسة سجلات ، سنشير إليها بالمصطلح TEMP [0..4]. لماذا خمسة وليس أقل ، سأشرح أقل قليلا.

خوارزمية الإجراءات:

1. TEMP[2]= A 2. TEMP[3]= B ----- 3. TEMP[0,1]= TEMP[2]/TEMP[3] 4. TEMP[1,2]= TEMP[1]*2 5. TEMP[4]= 0 6. TEMP[1..4]= TEMP[1,2]/TEMP[3,4] 7. TEMP[0]= TEMP[0]+TEMP[1] ----- 8. Y= TEMP[0] 

يمكن نقل الخطوات من 3 إلى 7 إلى روتين فرعي.

إذا رغبت في ذلك ، يمكن تسجيل النتيجة مباشرة عن طريق جمع TEMP [0] مع TEMP [1] خارج روتين الحساب. هذا غير مبدئي. الشيء الوحيد الذي يجب تذكره هو أنه مع الكثير من نفس النوع من الحسابات ، يمكن أن تؤدي إزالة عملية الإضافة إلى الجسم الرئيسي للبرنامج إلى زيادة في حجم ذاكرة البرنامج التي يستخدمها.

فلماذا استغرقت 5 سجلات للحوسبة المتوسطة؟ وعملية جمع ما تبقى من القسمة في حد ذاتها ، كما ذكرنا سابقاً ، يتم استبدالها بضرب الباقي في اثنين؟ بسيط للغاية - من أجل العمل مع عدد غير محدود من الأعداد الصحيحة.

دعني أشرح: إذا قسمنا ، على سبيل المثال ، الرقم 32767 على -32768 في الباقي نحصل على 32767 ، وستتجاوز نتيجة إضافته بلا شك نطاق العدد الصحيح.
أي أن الباقي المضاعف من القسمة الصحيحة للكسر من أجل تقريب نتيجة هذا القسمة يجب دائمًا تقديمه في شكل عدد صحيح مزدوج.
يتبع ...

Source: https://habr.com/ru/post/ar412613/


All Articles