نتائج غريبة من عمليات النقطة العائمة بسيطة - سيئة الحالة الداخلية فبو؟

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

سؤال

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

و(المترجم المستخدم هو MS VC 6.0، وهذا هو النسخة 12 من المترجم Microsoft C)

والشذوذ الأول:

extern double Time, TimeStamp, TimeStep;  // History terms, updated elsewhere
void timer_evaluation_function( ) {
    if ( ( Time - TimeStamp ) >= TimeStep ) {  
        TimeStamp += TimeStep;  
        timer_controlled_code( );  
    }
{....}

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

وانا التخمين الدولة FPU تشوبها بطريقة أو بأخرى من العمليات السابقة القيام بها، وأن هناك بعض الأعلام المترجم من شأنه أن يساعد؟

والشذوذ الثاني:

double K, Kp = 1.0, Ti = 0.02;
void timed_code( ){
    K = ( Kp * ( float ) 2000 ) / ( ( float ) 2000 - 2.0F * Ti * 1e6 )
{....}

والنتيجة هي #IND، على الرغم من أن المصحح يقيم المعادلة إلى حوالي 0.05. تظهر قيمة #IND في المكدس FPU عندما يتم تحميل قيمة 2.0F في FPU من استخدام تعليمات للمجلد. تعليمات السابق يحمل قيمة عددية 2000 تعويم مزدوجة باستخدام تعليمة fild. مرة واحدة يحتوي على كومة FPU قيمة #IND كل ما فقدت، ولكن مرة أخرى المصحح ليس لديه مشكلة تقييم الصيغة. في وقت لاحق، هذه العمليات تعود النتائج المتوقعة.

وبالإضافة إلى ذلك، مرة أخرى تحدث المشاكل FPU مباشرة بعد استدعاء دالة. يجب وضع عملية نقطة عائمة يمهد الدولة FPU بعد كل وظيفة جديدة؟ هل هناك علم المترجم التي يمكن أن تؤثر على FPU بطريقة ما؟

وأنا ممتن من أي وكل النصائح والحيل في هذه النقطة.

تحرير: لقد تمكنت من تجنب المشكلة عن طريق استدعاء الدالة التجمع EMMS أول شيء في وظيفة أعلى. وبهذه الطريقة FPU وتطهيرها من أي القمامة المتعلقة MMX قد تكون أو لا تم إنشاؤها في بيئة يسمى قانون بلدي من. ويبدو أن حالة FPU ليست شيئا أمرا مفروغا منه.

و// فرانك

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

المحلول

إذا كنت تستخدم QueryPerformanceCounter النوافذ وظائف QueryPerformanceFrequency على نظام يدعم MMX محاولة إدخال تعليمات femms بعد الاستعلام عن التردد / عداد وقبل الحساب.

__asm femms

ولقد واجهت مشكلة من هذه الدالة قبل حيث كانوا ينفذون حساب 64 بت باستخدام MMX وليس تطهير العائمة الأعلام نقطة / الدولة.

وهذا الوضع يمكن أن يحدث أيضا إذا كان هناك أي حساب 64 بت بين عمليات النقطة العائمة.

نصائح أخرى

وأي فكرة عما يمكن أن يكون مشكلة، ولكن على x86 و التعليمات FINIT مسح على FPU. لاختبار النظرية الخاصة بك، يمكنك إدراج هذا في مكان ما في التعليمات البرمجية:

__asm {
    finit
}

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

غير مهيأ متغيرات النقطة العائمة يمكن أن يكون مميتا

كيف العائمة استثناء المعامل نقطة صالح الحصول على أثار عندما I تعطيله؟

وبينما أنا لا يوفر لك حلا المحدد، أقترح عليك أن تبدأ من خلال قراءة هذا <وأ href = "http://msdn.microsoft.com/en-us/library/aa289157.aspx" يختلط = "نوفولو noreferrer "> المقالة أن يصف التحسينات المختلفة التي يمكن للمرء أن استخدام.

وإعادة: الطوابع -

وماذا أنت تحصل على مصدر للالطوابع الزمنية من؟ هناك شيء يبدو مريبا. حاول تسجيل إلى ملف.

إذا يتم تحميل قيمة سيئة من قبل FLD التي يجب تحميل 2.0، وأنا سوف تحقق الذاكرة حيث يتم تحميل هذه القيمة من - أنه قد يكون مجرد مشكلة مترجم / رابط

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