عدد فاصل عائم

من ويكيبيديا، الموسوعة الحرة
(بالتحويل من العمليات الحسابية على أعداد الفاصلة العائمة)
اذهب إلى: تصفح، ‏ ابحث


العمليات على الفاصلة العائمة[عدل]

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

تمثيل الأعداد بطريقة الفاصلة العائمة[عدل]

الصيغة وحيدة الدقة[عدل]

حيث يخصص 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)) وذلك بفرض أنه إمكانية تخزين أربعة أرقام عشرية فقط في القسم الكسري ورقمين من أجل القوة :

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

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

    10 + (-5) = 5  

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

10 + 127 = 137 -5 + 127 = 122 وبالتالي قوة الناتج 137 + 122 = 259 والنتيجة كبيرة جدا" على حقل القوة المخصص ل 8 بت لذلك لا بد من وجود شيء ما خطأ. المشكلة هي في الانحياز حيث تم إضافة الانحياز إلى القوة. قوة الناتج : (10 + 127) + (-5 + 127) = 259 وفقا" لذلك حتى نحصل على ناتج جمع صحيح للعددين عندما يكون هناك انحياز في المجال يجب أن نطرح الانحياز من المجموع. قوة الناتج :

   137 + 122 – 127 = 259 – 127 = 132 = 5 +127 

حيث 5 هي القوة التي نحتاجها في عملية الحساب الأولية.

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

عملية ضرب القسم العشري للعددين :

                       1.110
                       9.200  *
                       _____
                       0000                                                                
                        0000                                                               
                         2220                                                              
                          9990
                        _______
                       10212000                                                                 

من أجل كل معامل هناك ثلاث خانات عشرية على يمين الفاصلة العشرية لذلك سوف يتم توضيع الفاصلة العشرية بعد 6 خانات من الناتج. 10.212000 وبفرض أنه من الممكن الاحتفاظ بثلاث خانات فقط على يمين الفاصلة سوف يصبح الناتج: 10.212 * 10^5

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

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

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

بفرض أن القسم العشري بطول 4 خانات عشرية فقط لذلك نحن بحاجة إلى عملية تدوير الناتج : 1.0212 * 10^6 = 1.021 * 10^6

الخطوة الخامسة :

تحديد إشارة الناتج والتي تعتمد على إشارة المعاملات الأصلية فإذا كانت الإشارتين متماثلتين عندها تكون إشارة الناتج موجبة وإلا فإن إشارة الناتج سالبة وفي هذا المثال الناتج من إشارة موجبة. + 1.021 * 10^6 الإشارة في خوارزمية الجمع تحدد بعد جمع القسم العشري بينما في الضرب تحدد من خلال إشارتي المعاملات. الشكل (2) يظهر خوارزمية ضرب عددين باستخدام الفاصلة العائمة:

أمثلة عن عميلة الضرب:

مثال (1) :

لنحاول ضرب العددين (-0.4375) و(0.5) وذلك باستخدام خوارزمية الضرب.

الحل:

لنكتب العددين باستخدام الفاصلة العائمة : 0.5 = 1.000 * 2^-1 -0.4375 = -1.110 * 2^-2 1-جمع القوى للعددين دون انحراف : (-1) + (-2) =-3 أو باستخدام التمثيل المنحاز: (-1+127) + (-2+127) – 127 (-1-2) + (127+127-127) = -3 +127 = 124 2=ضرب القسم الكسري:

                                 1.000                                                     
                                 1.110  *
                                 _____
                                 0000                                                     
                                  1000
                                   1000                                                   
                                    1000                                                  
                                 _______
                                 1110000                                                     

الناتج1.110000 * 2^-3 ولكن المسموح به هو 4 بت فقط لذلك يكون الناتج (1.110 * 2^-3)

3-فحص الناتج هل هو بالصيغة القياسية أم لا ثم عملية فحص هل هناك overflow أو underflow فنلاحظ أن الناتج بالصيغة القياسية وذلك لأن 127 >= -3 >= -126 أي لا يوجد overflow أو underflow (وباستخدام التمثيل المنحرف للمجال 254 >= 124 >= 1 أي القوة تلائم المجال).

4-الناتج لا يحتاج إلى تدوير.

5- بسبب اختلاف الإشارة في المعاملات الأصلية فإن إشارة الناتج ستكون سالبة وبالتالي الناتج هو: -1.110 * 2^-3

مثال (2) :

أوجد ناتج ضرب العددين التاليين باستخدام خوارزمية الضرب لعددين ممثلين باستخدام الفاصلة العائمة: (1.100 * 2^130) * (1.010 * 2^129)

الحل:

               1-1.100 * 2^130                     
               1.010 * 2^129   *
               ___________
               0000                                                               
                1100                                                               
                 0000                                                                 
                  1100  +
               ______________
               1.111000 * 2^259                                            

توضيح :

في الناتج السابق نطرح من القوة (127) لأننا عندما جمعنا القوى أصبح لدينا مجموع إزاحة القوة الأولى والثانية وبالتالي يكون الناتج لعملية الضرب : 1.111000 * 2^132

ملاحظات :

1- من أجل إجراء عملية الطرح لعددين ممثلين بالفاصلة العائمة يمكن إنجاز هذه العملية على أنها عملية جمع لعددين أحدهما موجب والآخر سالب. 2- إن خوارزمية القسمة لعددين ممثلين بطريقة الفاصلة العائمة مطابقة تماما"لخوارزمية الضرب ولكن في عملية القسمة يتم تقسيم القسم الكسري للعدد الأول على القسم الكسري للعدد الثاني وطرح القوتين بدلا" من جمعهما وفي قوة الناتج يتم إضافة الإزاحة (127) بدلا" من طرحها قوة الناتج.

المراجع[عدل]