سؤال

لذلك لدي وظيفة التي تبدو شيئا مثل هذا:

float function(){
    float x = SomeValue;
    return x / SomeOtherValue;
}

في بعض نقطة, هذه الوظيفة تجاوزات و عوائد كبيرة حقا قيمة سالبة.في محاولة تعقب بالضبط أين كان هذا يحدث ، أضفت cout بيان ذلك أن وظيفة يشبه هذا:

float function(){
    float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}

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

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

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

المحلول

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

يحدث هذا بسبب الفرق بين IEEE المواصفات والأجهزة تشغيل التعليمات البرمجية على.وحدة المعالجة المركزية الخاصة بك من المحتمل أن 80 بت العائمة نقطة السجلات إلى عقد 32 بت تعويم قيمة.وهذا يعني أن هناك الآن أكثر دقة حين بلغت قيمة يبقى في تسجيل أكثر عندما يضطر إلى عنوان الذاكرة (المعروف أيضا باسم 'توجيه' السجل).

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

راجع وثائق MSDN على VC++ النقطة العائمة مفاتيح.قد تتمكن من محاولة ترجمة مع /fp:الصارم ورؤية ما يحدث.

نصائح أخرى

طباعة قيمة cout يجب أن لا تغيير قيمة paramter في أي طريقة على الإطلاق.

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

إضافة cout البيان يعني أن vaue x يستخدم مباشرة.دون أن محسن يمكن إزالة المتغير ، حتى تغيير النظام من حساب وبالتالي تغيير الإجابة.

بوصفها جانبا, انها دائما فكرة جيدة أن تعلن ثابتة المتغيرات باستخدام const:

float function(){
    const float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}

من بين أمور أخرى وهذا سوف تمنعك من غير قصد تمرير المتغيرات الخاصة بك إلى الوظائف التي يمكن تعديلها عن طريق غيرconst المراجع.

cout الأسباب إشارة إلى متغير ، والتي غالبا ما يسبب المترجم إلى تسرب إلى المكدس.

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

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

أنا لا أعتقد أن cout له أي تأثير على متغير, المشكلة يجب أن يكون في مكان آخر.

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