(إكمال) البرنامج التعليمي لفهم أخطاء الفاصلة العائمة IEEE

ملخص

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

مزيد من المعلومات

أنظمة الأرقام العشرية والثنائية

عادة، ونحن نعتمد الأشياء في الأساس 10. القاعدة عشوائية تماما. أن الناس قد استخدمت تقليديا الأساس 10 السبب الوحيد هو أن لديهم الأصابع العشرة التي قدمت أدوات يدوية الجرد.


رقم 532.25 بالتدوين العشري (الأساس 10) يعني ما يلي:

   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
500 + 30 + 2 + 2/10 + 5/100
_________
= 532.25


في النظام رقم ثنائي (الأساس 2)، يمثل كل عمود قوة 2 بدلاً من 10. على سبيل المثال، رقم 101.01 يعني ما يلي:

   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
4 + 0 + 1 + 0 + 1/4
_________
= 5.25 Decimal


كيف تمثل الإعداد الصحيحة في أجهزة الكمبيوتر الشخصية

لعدم وجود أي جزء كسرى إلى عدد صحيح، يتم تمثيله الجهاز أسهل بكثير مما عليه لقيم الفاصلة العائمة. يتم إعداد صحيحة طبيعية على أجهزة كمبيوتر شخصية (أجهزة كمبيوتر) 2 بايت (16 بت) طويلة مع بت الأكثر أهمية يشير إلى العلامة. يتم إعداد صحيحة طويلة طوله 4 بايت. القيم الموجبة أرقام ثنائية مباشرة. على سبيل المثال:

    1 Decimal = 1 Binary
2 Decimal = 10 Binary
22 Decimal = 10110 Binary, etc.


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

   4 Decimal = 0000 0000 0000 0100
1111 1111 1111 1011 Flip the Bits
-4 = 1111 1111 1111 1100 Add 1


لاحظ أن-1 العشرية = 1111 1111 1111 1111 الثنائي، مما يفسر لماذا يعامل Basic-1 ك true المنطقية (كافة وحدات البت = 1). وهذا نتيجة لعدم وجود عوامل منفصلة لمقارنات منطقية والمختصه بالبت. غالباً ما في Basic، من ملاءمة لاستخدام جزء التعليمات البرمجية أدناه عند البرنامج بإجراء مقارنات منطقية كثيرة. يساعد هذا إلى حد كبير إمكانية القراءة.

   CONST TRUE = -1
CONST FALSE = NOT TRUE


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

مضاعفات الفاصلة العائمة

يمكن تمثيل كل العدد العشري الصحيح تماما بعدد صحيح ثنائي؛ ومع ذلك، ليس هذا صحيحاً للأرقام الكسرية. في الحقيقة، كل رقم غير الرشيد في القاعدة 10 سيكون أيضا غير منطقي في أي نظام ذو أساس أقل من 10.


للثنائي، على وجه الخصوص، أرقام كسرية فقط يمكن أن تكون ممثلة في نموذج p/q، حيث يكون q إس عدد صحيح 2، يمكن التعبير بالضبط، مع عدد محدد من البتات.


لا يمكن تمثيل كسور عشرية حتى الشائعة، مثل الكسر العشري 0.0001، بشكل ثنائي. (0.0001 كسر ثنائية مكرر بنقطة 104 بت)!


وهذا يفسر سبب مثال بسيط كالتالي

   SUM = 0
FOR I% = 1 TO 10000
SUM = SUM + 0.0001
NEXT I%
PRINT SUM ' Theoretically = 1.0.


سيتم طباعة 1.000054 كإخراج. نشر خطأ صغير في تمثيل 0.0001 في ثنائي إلى المجموع.


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

   item1# = 69.82#
item2# = 69.20# + 0.62#
IF item1# = item2# then print "Equality!"


وهذا لن يتم طباعة "المساواة!" لأنه لا يمكن تمثيل 69.82 بشكل ثنائي، الذي يجعل القيمة التي تنتج من التعيين مختلفة قليلاً (في ثنائي) من القيمة التي يتم إنشاؤها من التعبير. في الممارسة العملية، يجب دوماً التعليمات البرمجية هذه المقارنات بطريقة تسمح لبعض التسامح. على سبيل المثال:

   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"


ستتم طباعة هذا "متساوية".

IEEE تنسيق الأرقام

تم شحن QuickBasic ل MS-DOS، الإصدار 3.0 مع إصدار MBF (Microsoft ثنائي النقطة العائمة) وإصدار IEEE (معهد مهندسي الكهرباء والإلكترونيات) للأجهزة مع رياضي. QuickBasic ل MS-DOS، الإصدارات 4.0 والإصدارات الأحدث فقط استخدام IEEE. اختيار Microsoft معيار IEEE لتمثيل قيم الفاصلة العائمة في الإصدارات الحالية من الأساسي للأسباب الأساسية الثلاثة التالية:

  1. للسماح Basic استخدام البيانية الرياضية Intel التي تستخدم تنسيق IEEE. لا يمكن استخدام البيانية سلسلة 80 × 87 Intel الأرقام تنسيق ثنائي Microsoft.
  2. لجعل الاتصال بين Basic و C باسكال FORTRAN و MASM أسهل بكثير إينتيرلانجواجي. وإلا سيكون إجراءات التحويل ليتم استخدامه لإرسال القيم الرقمية من لغة إلى أخرى.
  3. لتحقيق الاتساق. IEEE هو معيار للمحول البرمجي C و FORTRAN الصناعة المقبولة.
المثال التالي مقارنة سريعة لتمثيلات IEEE و MBF لعدد الدقة المزدوجة:

               Sign Bits   Exponent Bits   Mantissa Bits
--------- ------------- -------------
IEEE 1 11 52 + 1 (Implied)
MBF 1 8 56


لمزيد من المعلومات حول الاختلافات بين MBF و IEEE تمثيل الفاصلة العائمة، الاستعلام في Microsoft Knowledge Base على الكلمات التالية:

   IEEE and floating and point and appnote


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

المفاهيم العامة الفاصلة العائمة

من المهم جداً أن ندرك أن أي نظام الفاصلة العائمة الثنائية يمكن أن يمثل عدد محدود من قيم الفاصلة العائمة بشكل تام. يجب أن يمكن تقريب قيم أخرى بقيمة قابل للتمثيل الأقرب. تحديد معيار IEEE أسلوب تقريب القيم إلى القيمة قابل للتمثيل "أقرب". يدعم المعيار QuickBasic ل MS-DOS وتقريب وفقا لقواعد IEEE.


أيضا، ضع في اعتبارك أن الأرقام التي يمكن تمثيلها في IEEE موزعة على نطاق واسع جداً. يمكنك تخيل لهم في بند رقم. كثافة عالية من أرقام قابل للتمثيل قرب 1.0 و-1، 0 ولكن أقل وأقل أثناء الانتقال نحو 0 أو اللانهاية.


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

تفاصيل IEEE

يتم تمثيل أرقام الفاصلة العائمة بالشكل التالي، حيث [الأس] هو الأس الثنائي:

   X =  Fraction * 2^(exponent - bias)


[] Fraction الموحدة الجزء الكسري للرقم، تمت تسويته نتيجة تعديل الأس بحيث يكون بت البادئ دائماً 1. بهذه الطريقة، لا يلزم تخزينها، والحصول على أكثر من بت واحد للدقة. هذا السبب في وجود بت ضمني. يمكنك اعتبار هذا مثل الرموز العلمية، حيث تقوم بمعالجة الأس للحصول على رقم واحد إلى يسار النقطة العشرية، ما عدا في ثنائي، يمكنك دائماً معالجة الأس حيث يكون البت الأول 1، نظراً لوجود 1s و 0s فقط.


[الانحياز] هو قيمة الانحياز المستخدمة لتجنب الاضطرار إلى تخزين الأسس السالبة.


إزاحة لأرقام أحادية الدقة هو 127 و 1023 (عشري) لإعداد الدقة المزدوجة.


القيم يساوي 0 كافة ويتم حجز كافة 1 (ثنائي) لتمثيل حالات خاصة. هناك حالات خاصة أخرى أيضا، التي تشير إلى حالات الخطأ المختلفة.

أمثلة الدقة

1 = 2 * 2 ^ 1 = 0100 0000 0000 0000... ست عشري 0000 0000 = 4000 0000
ملاحظة البت صفراً، والأس المخزنة 128 أو 100 0000 0 الثنائي هو 127 بالإضافة إلى 1. (1) هي الجزء العشري المخزنة 000 0000... 0000 0000، الذي لديه الضمانات الرائدة 1 والثنائيه نقطة، ذلك الجزء العشري الفعلي هو 1.

-1 =-2 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 ست عشري 0000
نفس + 2 استثناء تم تعيين البت. يكون هذا صحيحاً لكافة أرقام الفاصلة العائمة تنسيق IEEE.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... ست عشري 0000 0000 = 4080 0000
نفس العشري، الأس زيادة بمقدار واحد (هو قيمة متحيزة 129 أو 1 0000 100 الثنائي.

6 = 1.5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40C 0 0000 سداسي عشرية
نفس الأس، الجزء العشري أكبر بمقدار النصف--(1) 100 0000... 0000 0000، حيث أنه كسر ثنائي هو 1-1/2 (قيم الأرقام الكسرية هي 1/2، 1/4، 1/8، إلخ.).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... ست عشري 0000 0000 = 3F80 0000
نفس الأس كقوى أخرى 2، الجزء العشري واحد أقل من 2 في 127 أو 011 1 1111 الثنائي.

.75 = 1.5 * 2 ^-1 = 0011 1111 0100 0000... ست عشري 0000 0000 = 3F40 0000
الأس متحيزة 126، هو 011 1111 ثنائي في 0 والجزء العشري هي (1) 100 0000... 0000 0000، وهو 1-1/2.

2.5 = 1.25 * 2 ^ 1 = 0100 0000 0010 0000... ست عشري 0000 0000 = 4020 0000
تماما مثلما 2 فيما عدا ما يمثل 1/4 يتم تعيين البت في الجزء العشري.

0، 1 = 1.6 * 2 ^-4 = 0011 1101 1100 1100... كككد 1101 = 3DCC 1100 ست عشري
1/10 كسر مكرر الثنائي. الجزء العشري مقتربا من 1.6، ويقول الأس متحيزة 1.6 أنه يمكن تقسيم 16 (وهو 011 1 1101 الثنائي هو 123 بالأرقام العشرية). الأس الحقيقي هو 123 127 =-4، وهذا يعني أن معامل ضرب 2 * *-4 = 1/16. لاحظ أنه يتم تقريب الجزء العشري المخزنة في جزء أخير. هذا محاولة لتمثيل رقم أونريبريسينتابل على أدق وجه ممكن. (السبب أن 1/10 و 1/100 بالضبط غير قابل للتمثيل الثنائي الطريقة 1/3 بالضبط غير قابل للتمثيل في العشرية.)

0 = 1، 0 * 2 ^-128 = كافة الأصفار-حالة خاصة.

أخطاء الفاصلة العائمة الشائعة الأخرى

فيما يلي بعض الأخطاء الشائعة الفاصلة العائمة:

  1. خطأ التقريب


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


    مثال: إضافة 0.0001 إلى 0.9900 (دقة واحدة)


    وسيمثل الكسر العشري 0.0001 ك:
    (1) 10100011011011100010111 * 2^(-14+Bias) (13 الرائدة 0s الثنائي!)
    سيتم تمثيل 0.9900 ك:
    (1.)11111010111000010100011 * 2^(-1+Bias)
    الآن الفعل إضافة هذه الأرقام، عشري (الثنائي) يجب أن تكون متسقة. ولهذا يجب أن أونورماليزيد. هنا هو إضافة الناتج:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
    +.111111010111000010100011 * 2^0
    ________________________________
    .111111010111011100110000 * 2^0


    يسمى هذا إلى خطأ التقريب لتقريب بعض أجهزة الكمبيوتر عند الإزاحة للإضافة. الآخرين ببساطة قم باقتطاع. أخطاء التقريب المهم الأخذ في الاعتبار عند إضافة أو ضرب قيمتين مختلفة جداً.
  2. طرح يومين تقريبا متساوية
           .1235
    -.1234
    _____
    .0001


    سيتم تسوية هذا. ملاحظة على الرغم من أن الأرقام الأصلية كل أربعة أرقام المعنوية، النتيجة وجود رقم كبير واحد فقط.
  3. تجاوز السعة وتجاوز الحد الأدنى


    يحدث هذا عندما تكون النتيجة كبيرة جداً أو صغيرة جداً لكي يتم تمثيلها بنوع البيانات.
  4. كوانتيزينج خطأ


    يحدث هذا مع تلك الأرقام التي لا يمكن تمثيلها بشكل تام بمعيار الفاصلة العائمة.
  5. القسمة على عدد صغير جداً


    وهذا يمكن أن تؤدي إلى خطأ "قسمة على صفر" أو يمكن أن يعطي نتائج غير صحيحة، كما في المثال التالي:
          A = 112000000
    B = 100000
    C = 0.0009
    X = A - B / C


    في QuickBasic ل MS-DOS، س الآن على قيمة 888887، بدلاً من الإجابة الصحيحة و 900000.
  6. الإخراج خطأ


    يحدث هذا النوع من الأخطاء عند تعديل وظائف الإخراج قيم العمل مع.
خصائص

رقم الموضوع: 42980 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات