سؤال

هذا هو التحليل العددي بدلا من سؤال البرمجة، لكنني أفترض أن البعض منكم سيكون قادرا على الإجابة عليه.

في مجموع اثنين من العوامات، هل هناك أي دقة فقدت؟ لماذا ا؟

في مجموع تعويم وعدد صحيح، هل هناك أي دقة فقدت؟ لماذا ا؟

شكرا.

هل كانت مفيدة؟

المحلول

في مجموع اثنين من العوامات، هل هناك أي دقة فقدت؟

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

لماذا ا؟

وذلك لأن العوامات المخزنة في شكل (علامة) (Mantissa) × 2(الأسف). وبعد إذا كانت قيمتين تتمتعان بمختلفين، وأنت تضيفها، فستحدد القيمة الأصغر إلى أرقام أقل في Mantissa (لأنها يجب أن تتكيف مع الأسف الأكبر):

PS> [float]([float]0.0000001 + [float]1)
1

في مجموع تعويم وعدد صحيح، هل هناك أي دقة فقدت؟

نعم، عدد صحيح طبيعي 32 بت قادر على تمثيل القيم بالضبط لا يصلح بالضبط في تعويم. يمكن أن تظل تعويم المتجر تقريبا نفس العدد، ولكن لم تعد بالضبط. بالطبع، هذا ينطبق فقط على الأرقام الكبيرة بما فيه الكفاية، أنا. ه. أطول من 24 بت.

لماذا ا؟

نظرا لأن Float لديه 24 بت من الأعداد الصحيحة الدقة و (32 بت) 32. ستظل تعويم قادرا على الاحتفاظ بحجم ومعظم الأرقام الكبيرة، ولكن قد تختلف الأماكن الأخيرة:

PS> [float]2100000050 + [float]100
2100000100

نصائح أخرى

الدقة يعتمد على حجم الأرقام الأصلية. في النقطة العائمة، يمثل الكمبيوتر الرقم 312 داخليا كدولة علمية:

3.12000000000 * 10 ^ 2

تم إصلاح المنازل العشرية في الجانب الأيسر (Mantissa). كما أن الأسلوب لديه أيضا ملزمة العلوي والسفلي. هذا يسمح له بتمثيل أرقام كبيرة جدا أو صغيرة جدا.

إذا حاولت إضافة رقمين وهو نفس الحجم، يجب أن تظل النتيجة هي نفسها في الدقة، لأن النقطة العشرية لا يجب أن تتحرك:

312.0 + 643.0 <==>

3.12000000000 * 10 ^ 2 +
6.43000000000 * 10 ^ 2
-----------------------
9.55000000000 * 10 ^ 2

إذا حاولت إضافة عدد كبير جدا وضغط صغير جدا، فسوف تفقد الدقة لأنها يجب يتم الضغط على التنسيق أعلاه. ضع في اعتبارك 312 + 12300000000000000000000. أولا عليك توسيع نطاق الرقم الأصغر للتصنيف مع أكبر واحد، ثم أضف:

1.23000000000 * 10 ^ 15 +
0.00000000003 * 10 ^ 15
-----------------------
1.23000000003 <-- precision lost here!

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

أما بالنسبة للمجلس الدولي والمزوجي، فإنه تمت إضافته، حيث يتم تحويل كثيرة إلى ضعف فورا، ثم ينطبق أعلاه.

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

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

الدقة المتاحة ل float محدود، لذلك بالطبع هناك دائما خطر أن تسقط أي عملية معينة الدقة.

الجواب لكلا أسئلتك هو "نعم".

إذا حاولت إضافة تعويم كبير جدا إلى واحد صغير جدا، فستكون لديك مشاكل.

أو إذا حاولت إضافة عدد صحيحا إلى تعويم، حيث يستخدم عدد صحيح المزيد من البتات أكثر من التعويم المتاح ل Mantissa.

الجواب القصير: يمثل الكمبيوتر تعويما بعدد محدود من البتات، والتي غالبا ما يتم ذلك مانتيسا والأسف, ، لذلك يتم استخدام عدد قليل فقط من البايتات للأرقام الكبيرة، ويتم استخدام الآخرين لتمثيل موقف النقطة العشرية.

إذا كنت قد حاولت إضافة (قل) 10 ^ 23 و 7، فلن تتمكن من تمثيل هذه النتيجة بدقة. تنطبق حجة مماثلة عند إضافة تعويم وعدد صحيح - سيتم الترويج للعدد الصحيحة إلى تعويم.

في مجموع اثنين من العوامات، هل هناك أي دقة فقدت؟ في مجموع تعويم وعدد صحيح، هل هناك أي دقة فقدت؟ لماذا ا؟

ليس دائما. إذا كان المبلغ تمثل مع الدقة التي تسألها، فلن تحصل على أي خسارة دقيقة.

مثال: 0.5 + 0.75 => لا خسارة دقة X * 0.5 => لا يوجد فقدان دقيق (إلا إذا كان x صغير جدا)

في الحالة العامة، يضيف المرء العوامات في نطاقات مختلفة قليلا لذلك هناك فقدان دقيق يعتمد فعليا على وضع التقريب. أي: إذا كنت تضيف أرقاما مع نطاقات مختلفة تماما، توقع مشاكل دقيقة.

Denormals هنا لإعطاء الدقة الإضافية في الحالات القصوى، على حساب وحدة المعالجة المركزية.

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

مع دلالات صارمة IEEE، يجب ألا تعطي اثنين من 32 بت العوامات دقة أفضل من 32 بت. في الممارسة العملية، قد يتطلب الأمر مزيدا من التعليمات لضمان ذلك، لذلك يجب ألا تعتمد على نتائج دقيقة ومتكررة مع النقطة العائمة.

في كلتا الحالتين نعم:

assert( 1E+36f + 1.0f == 1E+36f );
assert( 1E+36f + 1 == 1E+36f );

الحالة تعويم + int هي نفسها تعويم + تعويم، لأن التحويل القياسي يتم تطبيقه على INT. في حالة تعويم + تعويم، هذا يعتمد على التنفيذ، لأن التنفيذ قد يختار إجراء إضافة بدقة مزدوجة. قد يكون هناك بعض الخسارة عند تخزين النتيجة، بالطبع.

في كلتا الحالتين، الجواب هو "نعم". عند إضافة an. int إلى أ float, ، يتم تحويل عدد صحيح إلى تمثيل النقطة العائمة قبل أن تحدث الإضافة على أي حال.

لفهم السبب، أقترح عليك قراءة هذه الجوهرة: ما يجب أن يعرفه كل عالم الكمبيوتر عن الحساب العائم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top