بالاستمرار في البحث عن مشكلة الدقة العشرية باستخدام الحساب الثنائي ، الذي بدأ في المشاركات السابقة [1،2،3،4] ، تمكنت من تطوير خوارزميات لحساب الأعداد الحقيقية المقدمة في شكل أرقام عشرية عشرية ، والتي تعطي نفس النتيجة بالضبط كما لو سيتم إجراء الحسابات يدويًا.
تستخدم هذه الخوارزميات الحساب الثنائي الذي ينظمه معيار IEEE754. لاختبار تشغيل الخوارزميات ، تم تطوير برنامج اختبار في C ++ ينفذ آلة حاسبة عشرية 18 بت.
نظرًا لأن حجم المادة يتجاوز تنسيق المنشور ، فقد حددت النقاط الرئيسية في شكل ملخصات. سوف نطلق على هذا المنشور أطروحات مايو :(.
لذا
من المعروف أن
الحساب المألوف للمستخدم هو الحساب العشري.
هناك أيضًا حساب b-ary ، حيث b هو أساس نظام الأرقام ، مع أخذ أي قيمة غير صفرية [5].
لعرض الأرقام بمقاييس مختلفة ، نستخدم تدوين أرقام الفاصلة العائمة في شكل منتج للعقدة وبعض درجة التعسفية من الأساس. هذا هو ما يسمى الترميز الأسي.
إذا كانت درجة الرقم ثابتة وكان الجزء العشري من الرقم عددًا صحيحًا ، فإن هذا التنسيق يسمى تنسيق النقطة الثابتة. الحالة الخاصة لتنسيق النقطة الثابتة هي رقم تكون الدرجة فيه صفرًا. هذا التنسيق هو تنسيق صحيح.
إذا كان الجزء العشري عبارة عن عدد كسري في نظام الأعداد b-ary مع الجزء الصحيح c ≠ 0 و c <b ، فإن هذا الرقم يسمى تطبيع.
على الرغم من حقيقة أن الأرقام ، بحكم طبيعتها المادية ، هي أرقام تقريبية ، بالنسبة لجهاز حاسوبي ، هذه أرقام دقيقة ويجب على الجهاز إجراء عمليات عليها بدقة محددة من قبل المستخدم.
حسابات دقيقة في الوسط الحسابي الحصول على نتيجة بعدد معين من الأرقام المهمة الصالحة بعد النقطة [6].
يتم إجراء جميع الحسابات في الكمبيوتر في شكل ثنائي. بالنسبة لهم ، القاعدة هي b = 2.
نظرًا لأن أنظمة الأرقام الثنائية والعشرية لا يمكن مقاومتها ، عند تحويل الأرقام الحقيقية العشرية إلى رمز ثنائي ، فغالبًا ما نحصل على القيمة التقريبية للمكافئ الثنائي للرقم العشري. لذلك ، عند ترجمة الأرقام العشرية إلى ثنائية ، تحدث أخطاء التمثيل.
تسمى الأرقام العشرية التي لها المعادل الثنائي الدقيق قابلة للتمثيل.
تسمى الأرقام العشرية التي لا تحتوي على المعادل الثنائي الدقيق غير التمثيل.
يمكن تمثيل جميع الأرقام العشرية الصحيحة إذا كان عدد الأرقام المهمة في مكافئها الثنائي لا يتجاوز شبكة البت لمنطقة كلمة الآلة التي كُتبت فيها.
كلما زاد عدد الأرقام الثنائية ، تم تمثيل المكافئ الثنائي للرقم ، كلما كان خطأ العرض التقديمي أصغر. هذا يفسر الرغبة في زيادة سعة السجل التشغيلي للمعالج باستمرار.
أي رقم عشري يحتوي مكافئه الثنائي على عدد من الأرقام المهمة التي تتجاوز شبكة البت لكلمة آلية يمكن تمثيله تقريبًا.
العمليات الحسابية ، التي ينتج عنها نتيجة تجاوز عمق البت لكلمة الآلة mantissa ، تقوم بإرجاع عدد تقريبي.
قد تحتوي الأرقام التقريبية على أرقام صحيحة ومشكوك فيها وغير صحيحة.
تؤثر الأرقام غير الصحيحة في الحسابات على الدقة وقد تؤدي في بعض الأحيان إلى نتائج غير صحيحة تمامًا [3].
وفقًا لنظرية الحسابات التقريبية ، للحصول على النتائج الصحيحة ، يتم تقريب الأرقام التقريبية لاستبعاد الأرقام غير الصحيحة [6].
يتم تحديد الدقة التي يريدها المستخدم ، أو يمكنه الحصول عليها في الحسابات ، من خلال عدد الأرقام الصالحة التي توفرها الخوارزمية الحسابية.
يمكن تقريب أي رقم ثنائي إلى العدد المحدد من الأرقام الثنائية ، مع تجاهل وحدات البت الإضافية.
وبالمثل ، يمكن تقريب أي رقم عشري إلى العدد المطلوب من الأرقام العشرية ، مع تجاهل الأرقام الإضافية.
لا يمكنك ببساطة تجاهل الأرقام الثنائية الإضافية في رقم ثنائي لتقريب مكافئها العشري لعدد معين من الأرقام العشرية ، لأن تقليل عمق البت للمكافئ الثنائي لرقم عشري سيزيد من عدد الأرقام غير الصالحة في مكافئها العشري.
يمكن تمثيل أي رقم حقيقي يتم التعبير عنه في شكل كسر عشري بدقة في تنسيق رقم الفاصلة العائمة (TFT) ، حيث تكون العشري عددًا صحيحًا. سيوضح العارض في NTC موقع النقطة في هذا الرقم.
إذا تم تقديم الرقم بتنسيق NTC مع عدد عشري ، فيمكن تحويل الجزء العشري وأسي هذا الرقم إلى ثنائي.
جديد
التنسيق الذي يمثل فيه العشري TNT العشري بمكافئ ثنائي للعشري العشري ، ويكون الأس هو المكافئ الثنائي لقوة 10 (الأساس ب = 10) ، سيطلق عليه تنسيق ثنائي عشري مختلط (SDDF).
الفرق بين SDDF وتنسيق NTP الثنائي هو أن الأس في SDDF يساوي الدرجة الأساسية b = 10 ، في حين أن أس تنسيق NDT الثنائي يساوي الدرجة الأساسية الثنائية b = 2. وبناءً على ذلك ، بالنسبة إلى SDDF ، سيتم عرض الرقم كـ
ولل CNC ، بمعيار IEEE754 ، كما
.
الفرق بين تنسيق SDDF وتنسيق TFT العشري الثنائي (DDF أو BCD) هو أنه في DDF يكون الجزء العشري والأسي عددًا عشريًا صحيحًا حيث يتم كتابة كل رقم كبايت أو رباعي ، في حين يتم التعبير عن جميع الأرقام العشرية بتنسيق SDDF معادلاتها الثنائية الصحيحة.
وبالتالي ، يمكن تمثيل أي رقم حقيقي عشري في SDDF برمز ثنائي يصل إلى N أرقام عشرية كبيرة.
يتم تنفيذ جميع العمليات الحسابية على CTDs العشرية في SDDF وفقًا لقواعد الحساب العادي ، حيث تكون جميع الحجج أعدادًا صحيحة.
قبل كل عملية حسابية ، يتم تمثيل الرقم العشري بتنسيق SDDF: [S ، M ، z ، e]. أين يوجد رمز S الخاص بعلامة الرقم (0 أو 1). M هو المعادل الثنائي الثنائي لعشري عدد مع عدد الأرقام العشرية N. حيث N هي دقة الحسابات. z هي علامة الأس ، e هي قيمة الأس. مثل هذا التمثيل هو تمثيل عشري عادي.
على سبيل المثال ، بالنسبة للحسابات الدقيقة إلى N = 7 أرقام مهمة ، يجب تمثيل الرقم 123456 بالشكل 1234560 * 10 ^ -4.
الحد الأدنى للعشري العشري لـ N = 7 سيكون M = 1،000،000.
الحد الأقصى للعشري العشري لـ N = 7 سيكون M = 9999999.
سيكون المعادل الثنائي للرقم 7 بت الأقصى 9999999 هو 100 110 001 001 011 001111111. يحتوي على 24 رقمًا ثنائيًا. لذلك ، يلزم تسجيل ثنائي 24 بت لتمثيل mantissas العشرية في النطاق من 1،000،000 إلى 9999999.
إذا في كلمة آلة ثنائية 32 بت ، حيث يتم تعيين 24 رقمًا إلى الجزء العشري ، يتم تعيين رقم واحد إلى علامة الرقم S ، ورقم واحد إلى علامة الأس z ، و 6 أرقام إلى الأس ، ثم يمكن تمثيل الأرقام الحقيقية العشرية في مثل SDF دقيقة إلى N = 7 أرقام عشرية كبيرة. تتراوح القيم المطلقة لهذه الأرقام من 1،000،000 * 10 ^ -64 إلى 9999999 * 10 ^ 64.
بعد كل عملية حسابية ، يجب تسوية الجزء العشري من الرقم وتقريبه إلى أقرب عدد صحيح. للقيام بذلك ، يجب مضاعفة المعادل الثنائي الناتج من الجزء العشري للعدد ، إذا لزم الأمر ، أو قسمةه على المعادل الثنائي 10 إلى الحد الذي يصبح فيه عدد أرقام المعادل العشري للعشري مساويًا لـ N. يجب تقريب الرقم الناتج إلى أقرب عدد صحيح.
مثال.أوجد حتى قيمة N = 7 نتيجة التعبير (9675،423 * 10 ^ 2-9،675421 * 10 ^ 5) * 10 ^ 6 - 199992
يتم حساب هذا التعبير يدويًا أو باستخدام حاسبة Windows ، وسيكون هذا التعبير مساويًا للرقم 8.000000
نكتب المعاملات في شكل طبيعي:
A=9,675423*10^5= 9675423*10^-1
B= 9675,421*10^2 = 9675421*10^-1
C=1000000 = 1000000*10^0
D = 1999920*10^-1
في SDDF ، سيتم تمثيل هذه المعاملات على النحو التالي:
A=[0, 9675423,1, 1]
B=[0,9675421,1, 1]
C=[0, 1000000,0, 0]
D=[0, 1999920,1, 1]
أوجد الفرق S = AB. بما أن دعاة المعاملين A و B متماثلان ، نجد الجزء العشري لفرقهما:
9675423-9675421=2
لتطبيع الجزء العشري ، يجب ضرب S بـ 10 ^ 6 ، بينما يجب تقليل الأس بـ 6. ثم S = 2 * 1،000،000 = 2،000،000 * 10 ^ -7
نحسب المنتج P = D * C. للقيام بذلك ، اضرب الجزء العشري للعوامل وأضف الأسس:
م = 2،000،000 * 10 ^ -7 * 1،000،000 * 10 * 0 = 2،000،000،000،000 * 10 ^ -7
بعد تطبيع العشري ، نحصل على P = 2،000،000 * 10 ^ -1.
ستكون نتيجة الحساب R مساوية:
R = PD = 2،000،000 * 10 ^ -1-1999920 * 10 ^ -1 = 80 * 10 ^ -1
بعد التطبيع ، نحصل على R = 8000000 * 10 ^ -6.
للمقارنة ، حساب هذا التعبير في إكسيل يعطي النتيجة R = 8،0000698E + 00.
قام المؤلف بتطوير خوارزمية حاسبة في SDDF تقوم بإجراء الجمع والطرح والضرب والقسمة للأرقام العشرية حتى 18 رقمًا مهمًا. لتأكيد صحة الخوارزمية ، تمت كتابة برنامج C ++. نظرًا لأن المؤلف ليس مبرمجًا محترفًا ، فإن البرنامج المطور مخصص فقط لدراسة خوارزمية الحساب.
أدناه ، على سبيل المثال ، لقطة شاشة توضح حساب التعبير التالي:
1,23456789098765432*10^8 * 9,87654321234567891*10^(-9) - 1,2193263123914037*10^0≈ 3.0*10^(-17)

لاختبار الأداء ، تم إطلاق عملية ضرب رقمين 18 بت في دورة. تم تشغيل البرنامج على كمبيوتر Intel® Core (TM) i3-4330 CPU@3.50GHz 3.50 GHz. رام ٨ جيجابايت. نوع النظام: 64 بت كانت السرعة تساوي ≈ 2.4 * 10 ^ 6 ضربات في الثانية.
لا يمكنني المقارنة مع سرعة حاسبات Windows و Excel حتى الآن ، لا يوجد تعليم كافٍ :(. أما بالنسبة لدقة الحسابات ، فالأمر نفسه كما لو كانت الحسابات تتم يدويًا.
المراجع:
- منظر جانبي: معيار IEEE754
- هل التطبيع العائم ضروري؟
- أخطاء حسابية ثنائية مميتة عند العمل مع أرقام الفاصلة العائمة
- مرة أخرى حول أرقام الفاصلة العائمة
- أنظمة الأعداد
- القواعد الأساسية للحسابات التقريبية