حسابات الفاصلة المتحركة

[تصغير|[زد3 (حاسوب)|زد3 هو كمبيوتر كهربائيًا قابلاً للبرمجة يتضمن حسابات الفاصلة المتحركة (نسخة متماثلة معروضة في المتحف الألماني في ميونيخ).]]
**العدد الفاصل العائم** أو **المتحرك** هو عدد عشري ويمكن كتابته على صورة حاصل ضرب (كسر) في (العدد 10 مرفوعا إلى أس صحيح) على النحو التالي: اقرأ من اليسار إلى اليمين

101*12.5 = 102*1.25 = 103*0.125 = 125

وإذا رمزنا للأساس بالرمز E فإن العدد السابق يصبح كما يلي:

12.5E1 = 1.25E2 = 0.125E3 =125

أما إذا كان العدد كسرياً مثل 0.00127 فيمكن كتابته على النحو التالي:
باستبدال 10 الأساس بالرمز E فإن تمثيل العدد يصبح كالآتي:
0.00127 = 12.7E-4 = 1.27E-3 = 0.127E-2 = 0.0127E-1

يلاحظ مما سبق أن موقع النقطة داخل العدد عائم (غير ثابت) ويعتمد على الأس المرفوع له أساس نظام العد.
ويمكن اعتبار أي عدد ممثل بواسطة النقطة العائمة منسجماً مع الشكل العام التالي:
تصغير
حيث:
* M الجزء الكسري من العدد (Mantissa or Fraction).
* E أساس نظام العد.
* P الأس (القوة)(Exponent or Characteristic).

يشترط في العدد الممثل بواسطة النقطة العائمة ألاّ يكتب على شكل عدد صحيح وألاّ يكون أول رقم فيه على يمين النقطة صفراً.

ويسمى هذا الشكل الموصوف بهذه الشروط بالشكل المعياري للعدد الممثل بالنقطة العائمة. ومثال ذلك العدد الثنائي 110.110 يمثل بالشكل المعياري بواسطة النقطة العائمة كما يلي:
23*110110

## تمثيل الأعداد بطريقة الفاصلة العائمة في الحاسوب
عادة يكتب الشكل العام للعدد الممثل بالنقطة العائمة في الحاسوب ضمن الكلمة (Word) داخل الحاسوب، ويخصص لكل جزء من أجزاء الكلمة عدد معين من الخانات بما في ذلك الجزء الخاص بالإشارة، وذلك حسب طول الكلمة المستعملة في الحاسوب والشكل التالي يبين كلمة حاسوب تستعمل فيه النقطة العائمة.

إن الشكل العام لهذه الكلمة يمكن أن يختلف من حاسوب إلى آخر و خاصة فيما يتعلق بترتيب أجزاء الكلمة.

### الصيغة وحيدة الدقة

حيث يخصص 23 بت للقسم الكسري و8 بت للأس والبت الأخير للإشارة.
وبشكل عام يكون للأعداد الممثلة بالفاصلة العائمة وبهذه الطريقة الصيغة التالية: ((s*(1+2^−1+2^−2+2^−3+....+2^−15)*2^(e-127)

مع e ببتات الأس وs بت الإشارة.

### الصيغة مضاعفة الدقة

حيث يخصص 52 بت للقسم الكسري و11 بت للأس والبت الأخير للإشارة.
وبشكل عام يكون للأعداد الممثلة بالفاصلة العائمة وبهذه الطريقة الصيغة التالية: ((s*(1+2−1+2−2+2−3+....+2−23)*2^(e-1023)

مع e ببتات الأس وs بت الإشارة.

البيتات ممثلة كالتالي:

ملف:IEEE 754 Double Floating Point Format.svg

مثال:
العدد (0.75-) يتم تمثيله باستخدام طريقتي تمثيل الفاصلة العائمة:
1-باستخدام الصيغة وحيدة الدقة:

 (0.75)10 = (0.11)2 = 1.1*2^-1 (-1)^1*(1+0.1)*2 (-1+127) = (-1)^1*(1.1)*2*126
وبالتالي يكون توزع البيتات:

            0000 0000 0000 0000 0000 0100 1111 1011
            ____ ____ ____ ____ ____ ____ ____ ____
             0    0    0     0    0   4    B     F
ومنه فان (0.75-)=BF400000:

 باستخدام الصيغة مضاعفة الدقة: (0.75)10=(0.11)2=1.1*2^-1 (-1)^1*(1+0.1)*2 (-1+1023)=(-1)*(1.1)*(1022)
   
              0000 0000.....0000 0000 0000 0000 0000 1000 1110 1111 1011 
              ____ ____......____ ____ ____ ____ ____ ____ ____ ____ ____
                0    0         0    0    0    0    0    8   B     F    E

ومنه فان(0.75-)=BFE8000000000000

## العمليات على الفاصلة العائمة
فيما يلي سوف نتحدث بشئ من التفصيل عن عمليتي الجمع والضرب لعددين ممثلين باستخدام الفاصلة العائمة.

### جمع الأعداد الممثلة بطريقة الفاصلة العائمة
لنقم بجمع عددين عشريين ممثلين بطريقة الفاصلة العائمة وذلك من أجل توضيح المشاكل التي من الممكن مصادفتها أثناء عملية الجمع.
بفرض لدينا العددين: +(1.610*10^-1) (9.999*10^1)
وبفرض أننا نستطيع أن نخزن أربع خانات عشرية فقط في القسم الكسري وخانتين عشريتين فقط في القوة.

1-الخطوة الأولى:

حتى نستطيع أن نقوم بجمع هذين العددين يجب أن نرتب الفاصلة العشرية في العدد الأصغر أي يجب أن نجعل العدد الأصغر على الشكل 1.610*10^-1
وذلك بشكل مماثل للقوة في العدد الأكبر. ويمكن أن نحقق ذلك بالاستفادة من التمثيل المتعدد للرقم بواسطة الفاصلة العائمة:

0.610*10^-1=0.1610*10^0=0.01610*10^1
حيث تمثل الصيغة على اليمين الصيغة المطلوبة (قوة العدد الأصغر أصبحت مماثلة لقوة العدد الأكبر) وبالإيجاز يمكن إنجاز ذلك بإزاحة القسم الكسري للعدد الأصغر إلى اليمين وتعديل القوة حتى تصبح مساوية لقوة العدد الأكبر.
0.016*10^1
طبعا" مع الملاحظة أنه لا يمكن السماح بأكثر من أربع خانات عشرية في القسم الكسري مما يستدعي إهمال بعض الخانات على يمين الفاصلة.

- الخطوة الثانية:

وهي تتمثل بجمع القسم الكسري للعددين
             9.999
          +  0.016
             _____
             10.015      وبالتالي يكون ناتج الجمع(0.015*10^1)

3-الخطوة الثالثة:

إن الناتج الذي حصلنا غير مكتوب بالصيغة القياسية (الصيغة القياسية تتضمن رقم واحد فقط بعد الفاصلة) لذلك الناتج بحاجة إلى عملية تصحيح. باستخدام التمثيل المتعدد للرقم في الفاصلة العائمة:
10.015*10^1=1.0015*10^2
وهكذا تم العدة الناتج إلى الصيغة القياسية مع ملاحظة ملاءمته للقوة.
إن هذا المثال يظهر عملية إزاحة الناتج نحو اليمين. ولكن ماذا إذا كان أحد العددين موجب والأخر سالب في هذه الحالة من الممكن أن يكون ناتج الجمع مساويا للصفر وهذا يتطلب إزاحة الناتج نحو اليسار على أي حال القوة سواء بالزيادة أو النقصان يجب إجراء عملية فحص للتأكد فيما لذا كان هناك overflow أو underflow
أي يجب أن نكون متأكدين أن القوة لا تزال ضمن الحقل (أي ضمن المجال المسموح به).

- الخطوة الرابعة:

في بداية المسألة افترضنا أن القسم الكسري يمكن أن يستوعب فقط أربع خانات عشرية لذلك يجب إجراء عملية تدوير للعدد وذلك باستخدام قواعد التدوير (التقريب).
فمن أجل تقريب عدد ما: إذا كان الرقم على يمين النقطة المرغوبة يقع ما بين 0__4 فإننا نحذف كل الخانات على يمين هذه النقطة وآلا إذا كان الرقم محصور بين 5__9 فأننا نضيف 1 إلى الرقم الذي يليه.
العدد 1.0015*10^2 يتم تدويره بحيث يتضمن أربع خانات عشرية فقط في القسم الكسري وبذلك يصبح 1.002*10^2 حيث أن الخانة على اليمين تقع بين 5 و9....

ملاحظة:

إن عملية التدوير يمكن أن تتم قبل أو بعد التحويل إلى الصيغة القياسية ولكن الأفضل هو بعد عملية التحويل.
خوارزمية جمع عددين باستخدام الفاصلة العائمة:
الشكل (1) يظهر خوارزمية جمع عددين ثنائيين ممثلين باستخدام الفاصلة العائمة كما تمت المناقشة في المثال السابق حيث تمت في الخطوة الأولى والثانية تسوية العدد الأصغر وجمعه مع العدد الأكبر وفي الخطوة الثالثة تم إعادة الناتج إلى الصيغة القياسية. اختبار ال overflow أو underflow في الخطوة الثالثة يعتمد على دقة المعاملات هذا يعني بالنسبة لدقة الإشارة أن أعظم قوة هي 127 وأن أصغر قوة هي -126 ففي الصيغة مضاعفة الدقة يكون مجال القوة محصورا" بين 1023__-1022.

أمثلة حول عملية الجمع:

مثال (1):

اجمع العددين التاليين: 0.5 و-0.4375 وذلك باستخدام الفاصلة العائمة.
الحل:
قبل البدء بعملية الجمع يجب تمثيل العددين باستخدام الفاصلة العائمة كالتالي : (0.5)=1.000*2^-1
-0.4375)=-1.110*2^-2)
1-التعديل يطبق على العدد الثاني حيث يتم إزاحة قسمه الكسري نحو اليمين حتى تصبح قوته مساوية لقوة العدد الأكبر :
-1.110*2^-2=-0.111*2^-1

2-عملية جمع القسم الكسري للعددين:

1.000*2^-1)+(-0.111*2^-1)=0.001*2^-1)
3-إعادة الناتج للصيغة القياسية مع فحص حالة overflow وunderflow
0.001*2^-1=0.010*2*-2=0.100*2^-3=1.000*2*-
حيث>= -1 127>= -4 أي لا يوجد هناك overflow.
4-عملية تدوير الناتج: نلاحظ أن الناتج لا يحتاج إلى تدوير.

مثال(2):

أوجد ناتج جمع العددين التاليين 1575*10^13: و503*10^5 مع العلم أن المسموح به هو رقمين عشريين فقط بعد الفاصلة.

الحل:
بتطبيق الخوارزمية السابقة بشكل مباشر:
1-15.75*10^5 + 503*10^5
2-(15.75 + 503) * 10^5 = 518.75 *10^5
3- نلاحظ أن الناتج لا يحتاج إلى عملية إزاحة.
4- الناتج لا يحتاج إلى عملية تدوير.

مثال (3):

أوجد ناتج جمع العددين التاليين: 13 و33 وذلك بفرض أن المسموح به هو خمس أرقام فقط بعد الفاصلة.

الحل:
يجب قبل البدء بعملية الجمع لا بد من تمثيل العددين بطريقة الفاصلة العائمة.
 (13)10 = (1101)2 = 1.101 * 2^3 (33)10 = (100001)2 = 1.00001 * 2^5

بتطبيق خوارزمية الجمع مباشرة.
1-	13 = 0.01101 * 2^5
2- 13 : 0.01101 * 2^5
                                  33 : 1.00001 * 2^5
                                       ____________
                                       1.01101 * 2^5
3- الناتج مكتوب بالصيغة القياسية.

4- الناتج لا يحتاج لعملية تدوير.

### ضرب عددين باستخدام الفاصلة العائمة

بعد أن تمت مناقشة عملية الجمع باستخدام الفاصلة العائمة سوف نتطرق لمناقشة عملية ضرب عددين باستخدام الفاصلة العائمة.
سوف نقوم بمناقشة الخوارزمية (خوارزمية الضرب) على العددين العشريين:
(1.110 * 10^10) * (9.200 * 10^-5)
وذلك بفرض أنه إمكانية تخزين أربعة أرقام عشرية فقط في القسم الكسري ورقمين من أجل القوة:

الخطوة الأولى:

على عكس الجمع سوف يتم حساب القوة لناتج الجمع وذلك بجمع بسيط للقوة في كل من

## مراجع

تصنيف:حسابيات حاسوبية