الفاصلة العشرية العائمة
حسابات الفاصلة العائمة العشرية (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) كمعلومات جانبية تُحسب بشكل منفصل.
لقد دعم حاسوب <b>IBM 650</b> تنسيق الفاصلة العائمة المكون من 8 أرقام في عام 1953. وفي عام 1977، دعمت آلة <b>Wang VS</b> الثنائية تنسيق الفاصلة العائمة العشرية المكون من 64 بت. أما في عام 1984، فقد دعم معالج <b>موتورولا 68881</b> ( Motorola ) تنسيقًا يحتوي على 17 رقمًا من العشرية و3 أرقام للأس، مع توفير مكتبة دعم النقطة العائمة لمعالج موتورولا 68040 ( Motorola ) تنسيق تخزين النقطة العائمة المتوافق المكون من 96 بت في عام 1990.
تتضمن بعض لغات الكمبيوتر تطبيقات للحسابات العشرية ذات الفاصلة العائمة، ومنها <b>PL/I</b> و .NET، بالإضافة إلى محرر emacs مع حزمة calc، ووحدة Decimal في لغة بايثون Python.
في عام 1987،[1] أصدر معهد مهندسي الكهرباء والإلكترونيات (IEEE) معيار <b>IEEE 854</b>، وهو معيار للحوسبة باستخدام الفاصلة العائمة العشرية. لكن هذا المعيار افتقر إلى مواصفات لكيفية ترميز البيانات ذات الفاصلة العائمة للتبادل مع أنظمة أخرى. وقد تمت معالجة هذه المسألة لاحقًا في معيار IEEE 754-2008 ، الذي قام بتوحيد ترميز البيانات العشرية العائمة، وإن كان ذلك باستخدام طريقتين بديلتين مختلفتين.[2]
تتضمن معالجات IBM POWER6 وPOWER الأحدث تقنية DFP (حسابات الفاصلة العائمة العشرية) في الأجهزة، وكذلك الحال مع نظام <b>نظام IBM z9</b> [3](وأجهزة zSeries الأحدث). تقدم SilMinds برنامج SilAx، وهو معالج مساعد DFP متجه قابل للتكوين. يُعرف معيار IEEE 754-2008 هذا الأمر بمزيد من التفصيل. كما أن لدى شركة Fujitsu معالجات Sparc بحجم 64 بت مزودة بتقنية DFP في الأجهزة.[4]
ترميز IEEE 754-2008
يُعرّف معيار IEEE 754-2008 تمثيلات الفاصلة العائمة العشرية المكونة من 32 و64 و128 بت. وكما هو الحال في تنسيقات الفاصلة العائمة الثنائية، يُقسّم الرقم إلى إشارة (sign)، وأُس (exponent)، وقيمة معنوية (significand).
على عكس الأعداد العشرية العائمة الثنائية، لا تُطَبَّع الأرقام بالضرورة؛ فالقيم التي تحتوي على عدد قليل من الأرقام المهمة لها تمثيلات محتملة متعددة، مثل: 1×100=0.1×101=0.01×102 وهكذا. عندما تكون القيمة الدالة صفرًا، يمكن أن يكون الأس أي قيمة على الإطلاق.
| تنسيقات الأعداد العشرية العائمة IEEE 754-2008 | ||||
|---|---|---|---|---|
| شكل | عشري(32 كيلو بايت) | عشري 128 | عشري64 | عشري 32 |
| حقل الإشارة (بتات) | 1 | 1 | 1 | 1 |
| حقل التركيبة (بت) | 5 | 5 | 5 | 5 |
| حقل استمرار الأس (بت) | w = 2×k + 4 | 12 | 8 | 6 |
| مجال استمرار المعامل (بت) | t = 30×k−10 | 110 | 50 | 20 |
| الحجم الإجمالي (بت) | 32×k | 128 | 64 | 32 |
| حجم المعامل (أرقام عشرية) | p = 3×t/10+1 = 9×k−2 | 34 | 16 | 7 |
| نطاق الأس | 3×2w = 48×4k | 12288 | 768 | 192 |
| أكبر قيمة هي 9.99...×10Emax | Emax = 3×2w−1 | 6144 | 384 | 96 |
| أصغر قيمة طبيعية هي 1.00...×10Emin | Emin = 1−Emax | −6143 | −383 | −95 |
| أصغر قيمة غير صفرية هي 1×10Etiny | Etiny = 2−p−Emax | −6176 | −398 | −101 |
اُختيرت نطاقات الأسس بحيث يكون النطاق المتاح للقيم الطبيعية متماثلًا تقريبًا. ونظرًا لعدم إمكانية تحقيق ذلك بدقة مع عدد زوجي من قيم الأسس الممكنة، فقد أُعطيت القيمة الإضافية لـ Emax.
تم تعريف تمثيلين مختلفين:
- الحقل الذي يحتوي على قيمة عدد صحيح ثنائي يشفر القيمة كقيمة عدد صحيح ثنائي كبير بين 0 و10 p −1. ومن المتوقع أن يكون هذا أكثر ملاءمة لتنفيذات البرامج باستخدام وحدة الحساب المنطقية الثنائية.
- هناك حقل آخر يحتوي على قيمة عشرية كثيفة ويقوم بترميز الأرقام العشرية بشكل أكثر مباشرة. يؤدي هذا إلى جعل التحويل من وإلى نموذج الفاصلة العائمة الثنائية أسرع، ولكنه يتطلب أجهزة متخصصة للتعامل معه بكفاءة. ومن المتوقع أن يكون هذا أكثر ملاءمة لتنفيذات الأجهزة.
يوفر كلا البديلين نفس النطاق من القيم القابلة للتمثيل.
تقتصر البتتان الأكثر أهمية من الأس على نطاق 0−2، وتقتصر البتات الأربعة الأكثر أهمية من الأس على نطاق 0−9. تُرمّز التركيبات الثلاثون الممكنة في حقل مكون من 5 بتات، إلى جانب أشكال خاصة لـ اللانهاية (infinity) و <b>NaN</b>(ليس رقمًا - 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
يتضمن هذا <b>الأعداد دون الطبيعية</b> (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) . [5]
إذا كانت البتتان الأوليان بعد بت الإشارة هما "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) مفقودة بشكل أساسي. هذا هو <b>خطأ التقريب</b> (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 (بعدالتقريب والتطبيع)
يُحسب الفرق في النقطة العائمة بدقة لأن الأرقام متقاربة - تضمن <b>نظرية ستيربينز</b> (Sterbenz's Theorem) هذا، حتى في حالة التدفق السفلي (underflow) عندما يتم دعم <b>التدفق السفلي التدريجي</b> (gradual underflow).
على الرغم من ذلك، فإن الفرق بين الأرقام الأصلية هو s=−1؛ a=4.877000، وهو ما يختلف بأكثر من 20% عن الفرق s=−1؛ e=4.000000 من التقريبات. في الحالات القصوى، قد تُفقد جميع الأرقام المهمة للدقة.
يوضح هذا الإلغاء (cancellation) الخطر الكامن في افتراض أن جميع أرقام النتيجة المحسوبة ذات معنى. إن التعامل مع عواقب هذه الأخطاء هو موضوع في التحليل العددي (numerical analysis)؛ انظر أيضًا <b>مشاكل الدقة</b> (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) في عمليات الضرب أو القسمة، على الرغم من أن الأخطاء الصغيرة قد تتراكم مع تكرار العمليات.
انظر أيضا
مراجع
- ↑ "Python Documentation for decimal". docs.python.org. مؤرشف من الأصل في 2025-05-22. اطلع عليه بتاريخ 2024-07-07.
- ↑ ".NET API Documentation for System.Decimal". learn.microsoft.com. اطلع عليه بتاريخ 2024-07-07.
- ↑ "IBM z9 EC and z9 BC — Delivering greater value for everyone" (PDF). 306.ibm.com. اطلع عليه بتاريخ 2018-07-07.
- ↑ "Arithmetic IPs for Financial Applications - SilMinds". Silminds.com. مؤرشف من الأصل في 2012-03-16.
- ↑ Decimal Encoding Specification, version 1.00, from IBM نسخة محفوظة 2024-12-15 على موقع واي باك مشين.
- Savard، John J. G. (2018) [2007]. "The Decimal Floating-Point Standard". quadibloc. مؤرشف من الأصل في 2018-07-03. اطلع عليه بتاريخ 2018-07-16.
- Beebe، Nelson H. F. (22 أغسطس 2017). "Chapter H. Historical floating-point architectures". The Mathematical-Function Computation Handbook - Programming Using the MathCW Portable Software Library (ط. 1). Salt Lake City, UT, USA: Springer International Publishing AG. ص. 948. DOI:10.1007/978-3-319-64110-2. ISBN:978-3-319-64109-6. LCCN:2017947446. S2CID:30244721.
- "Chapter 4. Data Formats". Sparc64 X/X+ Specification. Nakahara-ku, Kawasaki, Japan. يناير 2015. ص. 13.
{{استشهاد بكتاب}}: صيانة الاستشهاد: مكان بدون ناشر (link) - Goldberg، David (مارس 1991). "What Every Computer Scientist Should Know About Floating-Point Arithmetic" (PDF). ACM Computing Surveys. ج. 23 ع. 1: 5–48. DOI:10.1145/103162.103163. S2CID:222008826. مؤرشف من الأصل (PDF) في 2025-04-17. اطلع عليه بتاريخ 2016-01-20. (, , )
- US patent 3037701A, Huberto M Sierra, "Floating decimal point arithmetic control means for calculator", issued 1962-06-05
قراءة إضافية
- الأعداد العشرية ذات الفاصلة العائمة: خوارزميات الحاسوب ، وقائع الندوة السادسة عشرة لمعهد مهندسي الكهرباء والإلكترونيات حول الحساب الحاسوبي ( كوليشو، مايك ف. ، 2003)