(إكمال) برنامج تعليمي فهم IEEE أخطاء Floating-Point

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

اضغط هنا لرابط المقالة باللغة الانجليزية42980
إخلاء مسؤولية من محتوى قديم في قاعدة المعارف
عن تقديم الدعم التقني لهاو لذلك تظهر هذه المقالة كما هي و لن يتم تحديثها Microsoft تمت كتابة هذه المقالة بخصوص منتجات توقفت
الموجز
الرياضيات الفاصلة العائمة هو موضوع معقد confuses المبرمجين كثيرة. يجب أن البرنامج التعليمي أدناه تساعد في التعرف على برمجة الحالات حيث من المحتمل أن تحدث أخطاء الفاصلة العائمة وكيفية تجنب عليها. فإنه يجب أن تسمح لك أيضاً التعرف على الحالات التي تنتج عن قيود الرياضية الفاصلة العائمة تورث مقابل على أخطاء المحول البرمجي الفعلي.
معلومات أخرى

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

عادةً، نقوم حساب الأشياء في الأساس 10. الأساس إجبارية بشكل كامل. السبب الوحيد أن الأشخاص استخدمت traditionally الأساس 10 هو أن لديهم fingers 10 أجريتها أدوات counting سهل الاستخدام.

رقم 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				

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

Complications floating-Point

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

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

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

هذا يفسر سبب المثال بسيطة مثل التالية
   SUM = 0   FOR I% = 1 TO 10000      SUM = SUM + 0.0001   NEXT I%   PRINT SUM                   ' Theoretically = 1.0.				

سيقوم 1.000054 PRINT كما تم إخراجه. خطأ صغير في يمثل 0.001 في ثنائي النشر إلى المجموع.

سبب نفس دوماً يجب الحذر جداً عند جعل المقارنات على أرقام الحقيقي. يوضح المثال التالي خطأ برمجة شائعة:
   item1# = 69.82#   item2# = 69.20# + 0.62#   IF item1# = item2# then print "Equality!"				

هذا سوف NOT بطباعة "مساواة!" لأنه لا يمكن تمثيل 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. للسماح لـ لاستخدام coprocessors الرياضية Intel أي تنسيق استخدام IEEE. لا تعمل coprocessors سلسلة 80 × 87 Intel مع أرقام Microsoft تنسيق ثنائي.
  2. لجعل interlanguage استدعاء بين من Basic C Pascal FORTRAN MASM أسهل بكثير. وإلا، أن إجراءات التحويل سيتم استخدامه لإرسال القيم الرقمية من لغة إلى آخر.
  3. لتحقيق التناسق. هو IEEE صناعة المقبولة القياسية compilers C و FORTRAN.
التالي مقارنة سريعة تمثيلات IEEE و MBF رقم مزدوج للدقة:
               Sign Bits   Exponent Bits   Mantissa Bits               ---------   -------------   -------------   IEEE        1           11              52 + 1 (Implied)    MBF        1            8              56				

للحصول على مزيد من المعلومات حول الاختلافات بين IEEE MBF الفاصلة العائمة وتمثيل ، الاستعلام في قاعدة معارفMicrosoft على الكلمات التالية:
   IEEE and floating and point and appnote				

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

مفاهيم Floating-Point العامة

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

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

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

تفاصيل IEEE

يتم تمثيل أرقام الفاصلة العائمة في النموذج التالي حيث [الأس] هو الأس الثنائي:
   X =  Fraction * 2^(exponent - bias)				

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

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

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

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

أمثلة الدقة واحد

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

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

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

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

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

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

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

0.1 = 1-6 * 2 ^-4 = 0011 1101 1100 1100... 1100 1101 = hex CCCD 3DCC
1/10 عبارة عن كسر مكرر في ثنائي. الجزء العشري خجل فقط من 1-6 ويتم الأس biased تقول أنه يمكن تقسيم 16 1-6 (وهو 011 1101 1 في الملف الثنائي هو 123 بالأرقام العشرية). هو الأس صحيحاً 123-127 = - 4 وهذا يعني أن العامل الذي للضرب 2 **-4 = 1/16. لاحظ أنه يتم تقريب الجزء العشري المخزنة في بت آخر. هذا محاولة تمثل رقم unrepresentable كما بدقة قدر الإمكان. (السبب 1/10 و 1/100 يتم representable لا تتوافق في ثنائي يشبه الطريقة التي يتم لا تتوافق representable بالأرقام العشرية 1/3.)

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

أخطاء Floating-Point العامة الأخرى

فيما يلي أخطاء الفاصلة العائمة الشائعة:
  1. خطأ في الدورة إيقاف

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

    مثال: إضافة 0.001 إلى 0.9900 (الدقة مفرد)

    سيتم تمثيل 0.001 العشري كـ:
    10100011011011100010111 (1). * 2^(-14+Bias) (استخدام 0s ثنائي 13!)
    سيتم تمثيل 0.9900 كـ:
    11111010111000010100011 (1). * 2^(-1+Bias)
    الآن بالفعل إضافة هذه الأرقام, النقاط (ثنائي) العشري يجب أن تكون محاذاة. هذا يجب أن تكون Unnormalized. وفيما يلي إضافة الناتج:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained      +.111111010111000010100011 * 2^0      ________________________________       .111111010111011100110000 * 2^0						
    هذا يدعى خطأ الدورة إيقاف لأن بعض أجهزة الكمبيوتر تقريبه عند مع القيام بإزاحة للإضافة. الآخرين ببساطة باقتطاع. تقريب - إيقاف أخطاء يتم هامة يجب مراعاتها كلما تقوم بإضافته أو ضرب قيمتين مختلفة جداً.
  2. طرح اثنين تقريباً تساوي القيم
           .1235      -.1234       _____       .0001						
    هذا سوف يتم تسوية. لاحظ أنه على الرغم من أنه قد الأصلي الأرقام كل أربع خانات هامة ، الناتج له رقم كبير واحد فقط.
  3. تجاوز السعة "و" تجاوز الحد الأدنى

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

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

    هذا يمكن أن يقوم بتشغيل خطأ "قسمة بواسطة صفر" أو يمكن أن يؤدي إلى حدوث نتائج غير صحيحة كما في المثال التالي:
          A = 112000000      B = 100000      C = 0.0009      X = A - B / C						
    QuickBasic في MS-DOS X الآن على قيمة 888887 ، بدلاً من إجابة صحيحة 900000.
  6. خطأ إخراج

    يحدث هذا النوع من الأخطاء عند تبديل وظائف الإخراج قيم العمل مع.
1.00 2.00 3.00 4.00 4.00b 4.50 6.00 6.00b IEEETUTR 7.00 7.10

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 42980 - آخر مراجعة: 08/16/2005 21:27:52 - المراجعة: 3.1

Microsoft Visual Basic 2.0 Standard Edition, Microsoft Visual Basic 3.0 Professional Edition, Microsoft Visual Basic 4.0 Standard Edition, Microsoft Visual Basic 1.0 Standard Edition, Microsoft Visual Basic 2.0 Professional Edition, Microsoft Visual Basic 3.0 Professional Edition, Microsoft Visual Basic 4.0 Professional Edition, Microsoft Visual Basic for MS-DOS, Microsoft QuickBasic 4.0, Microsoft QuickBASIC 4.0b, Microsoft QuickBasic 4.5 لـ MS-DOS, Microsoft BASIC Compiler 6.0, Microsoft BASIC Compiler 6.0b, Microsoft BASIC Professional Development System 7.0, Microsoft Cinemania 97 Standard Edition

  • kbmt KB42980 KbMtar
تعليقات