لماذا أخبرني Visual Studio 2008 .9 - .89999999999999995 = 0.0000000000000005511151231257827؟

StackOverflow https://stackoverflow.com/questions/1662600

سؤال

عندما اكتب هذا في نافذة Visual Studio 2008 الفورية:

? .9 - .8999999999999995

هذا يعطيني هذا هو الجواب:

0.00000000000000055511151231257827

تقول الوثائق أن ضعف يحتوي على 15-16 أرقام من الدقة، لكنه يعطيني نتيجة مع 32 رقما من الدقة. أين كل هذا الدقة الإضافية قادمة من؟

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

المحلول

هناك نكون فقط 15-16 أرقام في الإجابة. كل تلك الأصفار الرائدة لا تحسب. الرقم هو في الواقع أشبه 5.5511151231257827 × 10-16. وبعد يحتوي الجزء Mantissa على 15-16 رقما فيه. يقدم Opponent (-16) لتحويل النقطة العشرية أكثر من 16 مكانا، لكنه لا يغير عدد الأرقام في العدد الإجمالي.

يحرر

بعد الحصول على بعض التعليقات، أنا فضولي الآن حول ما يحدث حقا. قمت بتوصيل الرقم المعني بهذا IEEE-754 محول. وبعد استغرق الأمر حرية التقريب الأخير "27" إلى "30"، لكن لا أعتقد أن هذا يغير النتائج.

يتحول المحول إلى أسفل الرقم في الأجزاء الثنائية الثلاثة:

تسجيل الدخول: 0 (إيجابي)
الأسهم: -51.
أهمية: 1.01000000000000000000000000000000000000000000000000000000000000 (ثنائي مقابل 1.2510)

لذلك هذا الرقم هو 1.012 × 2-51, ، أو 1.25.10 × 2-51. وبعد نظرا لعدم وجود ثلاثة أرقام ثنائية كبيرة فقط، فإن ذلك تشير إلى أن لارس قد تكون على شيء ما. لا يمكن أن تكون "ضوضاء عشوائية" لأنها هي نفسها في كل مرة يتم تحويل العدد فيها.

تشير البيانات إلى أن الرقم المخزوني الوحيد هو "5". يأتي الأصفار الرائدة من المسترأ وبقية الأرقام التي تبدو عشوائية على ما يبدو هي من الحوسبة 2-51.

نصائح أخرى

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

أساسا يتعلق الأمر بأرقام النقطة العائمة التي يتم تخزينها بدقة محدودة. عليك أن تفعل المقارنة مع بعض دلتا.

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal

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

الجزء 55511151231257827 (وهو أهمية أو مانتيسا) لديه 17 رقما عشريا، وهو قريب بما يكفي إلى 15-16 أرقام.

Lars D: ما تعتبره صحيحا، هو الصحيح فقط في سياق السؤال. .9 - .8999999999999995 يعمل إلى تعويم مع حد كبير 0.625 ورأس -50. أخذ 0.625 * 2-50 النتائج في 5.5511151231257827E-16. الآن، من سياق السؤال الأصلي، لدينا رقم مع 17 رقما هاما هل يحدث أن تكون أفضل التقريب الثنائي من 0.0000000000000005. ومع ذلك، فإن تلك الأزرار الرائدة لا تزال غير مهمة فيما يتعلق بتمثيل رقم النقطة العائمة.

? .9 - .8999999999999995

هذه العملية الطرح، مع 15-16 أرقام مهمة، تعطي

0.0000000000000005

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

تعني الجزء "العائم" من "النقطة العائمة" أنك تحصل على شيء أقرب إلى 5.5511151231257827 * 10 ^ (- 16). هذا ليس بالضبط كيفية تمثيله، لأنه بالطبع يتم ذلك في ثنائي تحت غطاء محرك السيارة، ولكن النقطة هي، فإن الرقم يمثله الأرقام الهامة، بالإضافة إلى رقم يمثل إلى أي مدى نقل Radix (النقطة العشرية). كما هو الحال دائما، يمكن أن تعطيك ويكيبيديا مزيدا من التفاصيل:

(الرابط الثاني يركز بشكل أكثر تحديدا على حالتك الخاصة.)

أعتقد أنه لأنه في النظام الثنائي، 5 دورية لأنها ليست قابلة للتفويض من قبل 2. ومن ثم ما قاله مارك رشاكوف ينطبق.

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