الفاصلة العشرية العائمة

**حسابات الفاصلة العائمة العشرية (DFP)** إلى تمثيل الأرقام االعشرية ذات الفاصلة العائمة وإجراء العمليات عليها. يتيح العمل مباشرةً مع الكسور العشرية (الأساس 10) تجنب أخطاء التقريب التي تحدث عادةً عند التحويل بين الكسور العشرية (الشائعة في البيانات التي يُدخلها الإنسان، مثل القياسات أو المعلومات المالية) والكسور الثنائية (الأساس 2).

تكمن ميزة **تمثيل النقطة العائمة العشرية (Decimal Floating-Point representation)** مقارنةً بتمثيل النقطة الثابتة العشرية والأعداد الصحيحة في قدرتها على دعم **نطاق أوسع بكثير من القيم**. على سبيل المثال، بينما يستطيع التمثيل الثابت الذي يخصص 8 أرقام عشرية و2 أرقام عشرية تمثيل أرقام مثل 123456.78، 8765.43، و 123.00، فإن التمثيل العائم الذي يحتوي على 8 أرقام عشرية يمكنه أيضًا تمثيل أرقام مثل 1.2345678، 1234567.8، 0.000012345678، و 12345678000000000.

يُسهم هذا النطاق الموسع في **إبطاء تراكم أخطاء التقريب بشكل كبير** أثناء الحسابات المتتالية. على سبيل المثال، يمكن استخدام **خوارزمية جمع كاهان (Kahan summation algorithm)** في النقطة العائمة لجمع العديد من الأرقام دون تراكم يُذكر لخطأ التقريب.

## التنفيذات
كانت الاستخدامات الميكانيكية المبكرة **للفاصلة العائمة العشرية** واضحة في '''المعداد'''**(abacus)**، والمسطرة الحاسبة **(slide rule)**، و**آلة حاسبة سمولوود (Smallwood calculator)**، وبعض الآلات الحاسبةالأخرى التي تدعم الإدخالات في **الترقيم العلمي (scientific notation)**. في حالة الآلات الحاسبة الميكانيكية، غالبًا ما يُعامل **الأس (exponent)** كمعلومات جانبية تُحسب بشكل منفصل.

لقد دعم حاسوب  تنسيق الفاصلة العائمة المكون من 8 أرقام في عام 1953. وفي عام 1977، دعمت آلة  الثنائية تنسيق الفاصلة العائمة العشرية المكون من 64 بت. أما في عام 1984، فقد دعم معالج  **( Motorola )** تنسيقًا يحتوي على 17 رقمًا من العشرية و3 أرقام للأس، مع توفير مكتبة دعم النقطة العائمة لمعالج موتورولا 68040 ( **Motorola** ) تنسيق تخزين النقطة العائمة المتوافق المكون من 96 بت في عام 1990.

تتضمن بعض لغات الكمبيوتر تطبيقات للحسابات العشرية ذات الفاصلة العائمة، ومنها  و **.[[نواة دوت نت|NET]]**، بالإضافة إلى محرر emacs مع حزمة `calc`، ووحدة `Decimal` في لغة بايثون '''Python'''.

في عام 1987، أصدر معهد مهندسي الكهرباء والإلكترونيات (IEEE) معيار ، وهو معيار للحوسبة باستخدام الفاصلة العائمة العشرية. لكن هذا المعيار افتقر إلى مواصفات لكيفية ترميز البيانات ذات الفاصلة العائمة للتبادل مع أنظمة أخرى. وقد تمت معالجة هذه المسألة لاحقًا في معيار '''IEEE 754-2008''' ، الذي قام بتوحيد ترميز البيانات العشرية العائمة، وإن كان ذلك باستخدام طريقتين بديلتين مختلفتين.

تتضمن معالجات **IBM** POWER6 و**POWER** الأحدث تقنية **DFP (حسابات الفاصلة العائمة العشرية)** في الأجهزة، وكذلك الحال مع نظام  (وأجهزة zSeries الأحدث). تقدم **SilMinds** برنامج **SilAx**، وهو معالج مساعد DFP متجه قابل للتكوين. يُعرف معيار **IEEE [[آي تربل إي 754 المنقح|754-2008]]** هذا الأمر بمزيد من التفصيل. كما أن لدى شركة Fujitsu معالجات Sparc بحجم 64 بت مزودة بتقنية DFP في الأجهزة.

## ترميز IEEE 754-2008
يُعرّف معيار **IEEE 754-2008** تمثيلات الفاصلة العائمة العشرية المكونة من 32 و64 و128 بت. وكما هو الحال في تنسيقات الفاصلة العائمة الثنائية، يُقسّم الرقم إلى **إشارة (sign)**، و**أُس (exponent)**، و**قيمة معنوية (significand)**.

على عكس الأعداد العشرية العائمة الثنائية، لا تُطَبَّع الأرقام بالضرورة؛ فالقيم التي تحتوي على عدد قليل من الأرقام المهمة لها تمثيلات محتملة متعددة، مثل: 1×100=0.1×101=0.01×102 وهكذا. عندما تكون القيمة الدالة صفرًا، يمكن أن يكون الأس أي قيمة على الإطلاق.

اُختيرت نطاقات الأسس بحيث يكون النطاق المتاح للقيم الطبيعية متماثلًا تقريبًا. ونظرًا لعدم إمكانية تحقيق ذلك بدقة مع عدد زوجي من قيم الأسس الممكنة، فقد أُعطيت القيمة الإضافية لـ **Emax**.

تم تعريف تمثيلين مختلفين:

* **الحقل الذي يحتوي على قيمة عدد صحيح ثنائي** يشفر القيمة كقيمة عدد صحيح ثنائي كبير بين 0 و10 *p* −1. ومن المتوقع أن يكون هذا أكثر ملاءمة لتنفيذات البرامج باستخدام وحدة الحساب المنطقية الثنائية.
* **هناك حقل آخر يحتوي على قيمة عشرية كثيفة** ويقوم بترميز الأرقام العشرية بشكل أكثر مباشرة. يؤدي هذا إلى جعل التحويل من وإلى نموذج الفاصلة العائمة الثنائية أسرع، ولكنه يتطلب أجهزة متخصصة للتعامل معه بكفاءة. ومن المتوقع أن يكون هذا أكثر ملاءمة لتنفيذات الأجهزة.

يوفر كلا البديلين نفس النطاق من القيم القابلة للتمثيل.

تقتصر البتتان الأكثر أهمية من الأس على نطاق 0−2، وتقتصر البتات الأربعة الأكثر أهمية من الأس على نطاق 0−9. تُرمّز التركيبات الثلاثون الممكنة في حقل مكون من 5 بتات، إلى جانب أشكال خاصة لـ **اللانهاية (infinity)** و **(ليس رقمًا - Not a Number)**.

إذا كانت البتات الأربعة الأكثر أهمية للدلالة فانها تقع بين 0 و7، تبدأ القيمة المشفرة على النحو التالي :
 s 00mmm xxx يبدأالأس بـ 00، ويكون معنويًا بـ 0mmm
 s 01mmm xxx يبدأالأس بـ 01، ويكون دالاً بـ 0mmm
 s 10mmm xxx يبدأالأس بـ 10، ويكون معنويًا بـ 0mmm
إذا كانت البتات الأربعة الرئيسية للدلالة (significand) هي ثنائية 1000 أو 1001 (أي 8 أو 9 عشريًا)، فإن الرقم يبدأ على النحو التالي:
 س 1100م xxx يبدأالأس بـ 00، ويزداد معنويا بـ 100م
 س 1101م xxx يبدأالأس بـ 01، ويدل على 100م
 س 1110م xxx يبدأالأس بـ 10، ويزداد معنويا بـ 100م
البت الرئيسي (**s** في الأعلى) هو **بت الإشارة (sign bit)**، بينما تقوم البتات التالية (**xxx** في الأعلى) بتشفير **بتات الأس الإضافية** وبقية **الرقم الأكثر أهمية**. ومع ذلك، تختلف التفاصيل الدقيقة لذلك وفقًا لبديل الترميز المستخدم.

تُستخدم التركيبات النهائية للـ**لانهايات (infinities)** و**NaNs (ليس رقمًا)**، وهي نفسها لكلا الترميزات البديلة:

s 11110 x × ± ما لا نهاية ... (انظر خط الأعداد الحقيقية الممتد )

s 11111 0 هادئ NaN .. (يتم تجاهل بت الإشارة)

s 11111 1 إشارة NaN ...(بت الإشارة يتم تجاهله)

في هذه الحالات، تُتجاهل جميع أجزاء الترميز الأخرى. وبالتالي، يُمكن تهيئة مجموعة من القيم إلى **NaNs (ليس رقمًا)** ببساطة عن طريق ملئها بقيمة بايت واحدة.

### حقل دلالة عدد صحيح ثنائي
يستخدم هذا التنسيق دلالة ثنائية من 0 إلى 10p−1. على سبيل المثال، يمكن أن تصل قيمة Decimal32 إلى 107−1=9,999,999=98967F16=1001100010010110011111112. على الرغم من أن التشفير يمكن أن يمثل دلالات أكبر، إلا أنها غير قانونية ويتطلب المعيار من التنفيذات التعامل معها على أنها 0، إذا تم مواجهتها عند الإدخال.

كما هو موضح أعلاه، يختلف التشفير اعتمادًا على ما إذا كانت البتات الأربعة الأكثر أهمية **للقيمة المعنوية (significand)** تقع في النطاق من 0 إلى 7 (ثنائيًا 0000 إلى 0111)، أو أعلى (ثنائيًا 1000 أو 1001).

إذا كانت البتتان بعد بت الإشارة هما "00" أو "01" أو "10"، فإن **حقل الأس (exponent field)** يتألف من 8 بتات تلي بت الإشارة (البتتان المذكورتان بالإضافة إلى 6 بتات من "حقل استمرار الأس"). أما **القيمة المعنوية (significand)** فهي البتات الـ 23 المتبقية، مع وجود بت 0 ضمني في المقدمة، كما هو موضح هنا بين قوسين:
```
s 00eeeeee  (0)ttt tttttttttt tttttttttt
 s 01eeeeee  (0)ttt tttttttttt tttttttttt
 s 10eeeeee  (0)ttt tttttttttt tttttttttt
```
 يتضمن هذا  **(subnormal numbers)** حيث يكون الرقم الدال الأول هو 0.

إذا كانت البتتان بعد بت الإشارة هما "11"، فسيتم تحويل حقل الأس المكون من 8 بتات بمقدار 2 بت إلى اليمين (بعد كل من بت الإشارة والبتات "11" بعد ذلك)، وستكون **القيمة الدالّة الممثلة (significand)** في البتات الـ 21 المتبقية . نستنتج في هذه الحالة، يوجد تسلسل مكون من 3 بتات **ضمني (أي غير مخزن)** "100" بالقيمة الحقيقية :
```
s 1100eeeeee (100)t tttttttttt tttttttttt
  s 1101eeeeee (100)t tttttttttt tttttttttt
  s 1110eeeeee (100)t tttttttttt tttttttttt
```
يشير التسلسل "11" المكون من 2 بت بعد بت الإشارة إلى وجود بادئة "100" ضمنية *مكونة* من 3 بت للدلالة .

لاحظ أن البتات الرئيسية في الحقل ذي الدلالة لا تقوم بتشفير الرقم العشري الأكثر أهمية؛ فهي ببساطة جزء من رقم ثنائي خالص أكبر. على سبيل المثال، يتم ترميز قيمة 8,000,000 على هيئة ثنائية `011110100001001000000000`، مع ترميز البتات الأربعة الرئيسية للرقم 7؛ القيمة الأولى التي تتطلب بت رقم 24 (وبالتالي شكل الترميز الثاني) هي 223=8,388,608.

في الحالات المذكورة أعلاه، القيمة الممثلة هي:

: (−1) إشارة × 10 أس−101 × ذات دلالة

تعمل صيغتا **Decimal64** و**Decimal128** بطريقة مشابهة، لكنهما تستخدمان حقولًا أكبر لاستمرار الأس والقيمة الدلالية. أما بالنسبة لصيغة Decimal128، فلا يُستخدم نموذج الترميز الثاني أبدًا في الواقع؛ إذ يمكن تمثيل أكبر قيمة صالحة، وهي 1034−1=1ED09BEAD87C0378D8E63FFFFFFFF16، في 113 بت.

### حقل دلالة عشري كثيف
في هذا الإصدار، تُخزن القيمة كسلسلة من الأرقام العشرية. يقع **الرقم الرئيسي** بين 0 و9 (ممثلاً بـ 3 أو 4 بتات ثنائية)، بينما تستخدم بقية الأرقام الدالة **الترميز العشري المعبأ بكثافة (DPD - Densely Packed Decimal)**.

تُدمج البتتان الرئيسيتان للأس والرقم الرئيسي (الذي يتكون من 3 أو 4 بتات) الخاص بالدلالة في الخمس بتات التي تلي بت الإشارة. يتبع ذلك مباشرةً حقل استمرار الأس ذو الإزاحة الثابتة.

أخيرًا، يتكون حقل الاستمرارية الدال من 2 أو 5 أو 11 جزءًا، يتألف كل جزء من 10 بتات، ويُشفر كل جزء 3 أرقام عشرية. .

إذا كانت أول بتين بعد بت الإشارة هي "00"، "01"، أو "10"، فهما يحددان البتات الأساسية للأس. أما البتات الثلاث التالية مباشرة، فتشكل الرقم العشري الرئيسي (من 0 إلى 7) . 

إذا كانت البتتان الأوليان بعد بت الإشارة هما "11"، فإن البتتين التاليتين هما البتات الرئيسية للأس، ويُضاف التسلسل "100" كبادئة إلى البت الأخير لتشكيل الرقم العشري الرئيسي (8 أو 9) :
```
Comb. Exponent     Significand
 s 1100 T (00)eeeeee(100T)[tttttttttt][tttttttttt]
 s 1101 T (01)eeeeee(100T)[tttttttttt][tttttttttt]
 s 1110 T (10)eeeeee(100T)[tttttttttt][tttttttttt]
```
تُستخدم التركيبتان المتبقيتان (11110 و 11111) من الحقل المكون من 5 بتات لتمثيل **±اللانهاية** و**NaNs (ليس رقمًا)**، على التوالي.

## العمليات الحسابية ذات الفاصلة العائمة
عادةً، عند إجراء عمليات حسابية بالفاصلة العائمة، تُحسب القيمة الرياضية بدقة أولًا، ثم تُقرب النتيجة لأقرب قيمة يمكن تمثيلها بالدقة المحددة. هذا هو السلوك المتوقع من أجهزة الكمبيوتر المتوافقة مع معايير IEEE، خاصةً في ظل ظروف التقريب الطبيعية وغياب أي حالات استثنائية .

لتبسيط الشرح وتسهيل الفهم، ستُستخدم دقة مكونة من 7 أرقام في الأمثلة. المبادئ الأساسية تبقى كما هي بغض النظر عن مستوى الدقة.

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

نستمر بطريقة الجمع المعتادة :

المثال التالي يوضح عددًا عشريًا، وهذا يعني ببساطة أن **الأساس (القاعدة) هو 10**.
 123456.7 =1.234567 × 10 5
  101.7654 =1.017654 × 10 2 =0.001017654 × 10 5
لذلك:
 123456.7 + 101.7654 =(1.234567 × 10 5 )+(1.017654 × 10 2)
            = (1.234567 × 10 5 )+(0.001017654 × 10 5)
            = 10 5 × (1.234567+0.001017654)
            = 10 5 ×1.235584654
هذا ليس شيئًا آخر غير **التحويل إلى [[كتابة علمية|الصيغة العلمية]]**. بالتفصيل:
 هـ=5؛ س=1.234567 (123456.7)
 + e=2؛ s=1.017654 (101.7654)

 هـ=5؛ ق = 1.234567
 + e=5؛ s=0.001017654  (بعد التحويل)
 --------------------
  e=5؛ s=1.235584654  (المجموع الحقيقي: 123558.4654)
هذه هي النتيجة الحقيقية، وهي المجموع الدقيق للمُعاملات. سيتم تقريبها إلى 7 أرقام ثم تطبيعها إذا لزم الأمر. النتيجة النهائية هي :
 ه =5؛ق=1.235585(المجموع النهائي:123558.5)
لاحظ أن الأرقام الثلاثة المنخفضة من المتغير الثاني (654) مفقودة بشكل أساسي. هذا هو  **(rounding error)**. في الحالات المتطرفة، قد يكون مجموع رقمين غير صفريين مساويًا لأحدهما :
 هـ=5؛ ق=1.234567
 + e=−3؛ s=9.876543

 هـ=5؛ ق=1.234567
 + e=5؛ s=0.00000009876543 (بعد التحويل)
  -------------------------------
  e=5؛ s=1.23456709876543  (المجموع الحقيقي)
  e=5؛ s=1.234567       (بعدالتقريب/التطبيع)
تحدث مشكلة أخرى تتعلق بفقدان الأهمية عندما يتم طرح تقريبات لعددين متساويين تقريبًا. في المثال التالي:

* s=5؛ a=1.234571 (وهو تقريب للعدد النسبي 123457.1467)
* s=5؛ b=1.234567 (وهو تقريب للعدد النسبي 123456.659)

 هـ=5؛ س=1.234571
 − e=5؛ s=1.234567
    --------------------
  هـ=5؛ س=0.000004
  e=−1؛ s=4.000000 (بعدالتقريب والتطبيع)
يُحسب الفرق في النقطة العائمة بدقة لأن الأرقام متقاربة - تضمن  **(Sterbenz's Theorem)** هذا، حتى في حالة **التدفق السفلي (underflow)** عندما يتم دعم  **(gradual underflow)**.

على الرغم من ذلك، فإن الفرق بين الأرقام الأصلية هو s=−1؛ a=4.877000، وهو ما يختلف بأكثر من 20% عن الفرق s=−1؛ e=4.000000 من التقريبات. في الحالات القصوى، قد تُفقد جميع الأرقام المهمة للدقة.

يوضح هذا **الإلغاء (cancellation)** الخطر الكامن في افتراض أن جميع أرقام النتيجة المحسوبة ذات معنى. إن التعامل مع عواقب هذه الأخطاء هو موضوع في '''التحليل العددي''' **(numerical analysis)**؛ انظر أيضًا  **(precision problems)**.

### الضرب
لإجراء عملية الضرب، تُضرب **الدلالات (significands)** معًا، بينما تُضاف **الأسس (exponents)**. بعد ذلك، تُقرّب النتيجة وتُطَبّع.
 هـ=3؛ س=4.734612
 × e=5؛ s=5.417242
 -----------------------
  e=8؛ s=25.648538980104(الناتج الحقيقي)
  e=8؛ s=25.64854(بعد التقريب)
  e=9؛ s=2.564854(بعد التطبيع)
ويتم التقسيم بنفس الطريقة، ولكن بطريقة أكثر تعقيدًا.

لا توجد مشاكل **إلغاء (cancellation)** أو **امتصاص (absorption)** في عمليات الضرب أو القسمة، على الرغم من أن الأخطاء الصغيرة قد تتراكم مع تكرار العمليات.

## انظر أيضا

* العدد العشري المشفر ثنائيًا (BCD)

## مراجع

## قراءة إضافية

* الأعداد العشرية ذات الفاصلة العائمة: خوارزميات الحاسوب ، وقائع الندوة السادسة عشرة لمعهد مهندسي الكهرباء والإلكترونيات حول الحساب الحاسوبي ( كوليشو، مايك ف. ، 2003)

تصنيف:10 (عدد)
تصنيف:حسابيات حاسوبية
تصنيف:صفحات بترجمات غير مراجعة