سؤال

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

لماذا يحدث هذا؟هل هذا له علاقة بـ "أوامر الحجم"؟هل هناك أي حل بديل لهذه المشكلة؟

شكرا لك مقدما.

يحرر:

التغيير إلى الدقة المزدوجة أو العشرية ليس خيارًا في الوقت الحالي.

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

المحلول

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

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

يحرر: كما ذكرت أن استخدام double ليس خيارًا يمكنك استخدامه جمع كاهان, ، مثل akuhn وأشار في تعليق.

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

نصائح أخرى

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

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

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

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

مع float, ، تحصل فقط على دقة حوالي سبعة أرقام.لذلك سيتم تقريب رقمك إلى 1f.إذا كنت ترغب في تخزين هذا الرقم، استخدم double بدلاً من

http://msdn.microsoft.com/en-us/library/ayazw934.aspx

وبالإضافة إلى الإجابة المقبولة: <م> إذا كنت بحاجة لتلخيص العديد من عدد قليل وبعض أكبر منها، يجب عليك استخدام <لأ href = "http://en.wikipedia.org/wiki/Kahan_summation_algorithm" يختلط = "نوفولو noreferrer"> كاهان الملخصات .

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

وغالبا ما يتم ذلك إذا كان المعالج الهدف يفتقر إلى وحدة الأجهزة الفاصلة العائمة.

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

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