كيف يمكنني التعامل مع أخطاء غريبة من حساب ACOS / SIN / ATAN2؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

هل رأى أي شخص هذه القيمة الغريبة أثناء التعامل مع Sin / Cos / Tan / ACOs .. أشياء الرياضيات؟

=== القيمة الغريبة ===

-1.#ind00

=====================

void inverse_pos(double x, double y, double& theta_one, double& theta_two)
{
    // Assume that L1 = 350  and L2 = 250


    double B = sqrt(x*x + y*y);
    double angle_beta = atan2(y, x);
    double angle_alpha = acos((L2*L2 - B*B - L1*L1) / (-2*B*L1));
    theta_one = angle_beta + angle_alpha;
    theta_two = atan2((y-L1*sin(theta_one)), (x-L1*cos(theta_one)));
}

هذا هو الكود الذي كنت أعمل عليه.

في حالة معينة - مثل عندما تكون X&Y 10 و 10 ،يخزن هذا الرمز -1.#ind00 في theta_one & theta_two.

لا يبدو مثل الشخصيات أو الأرقام :(

بلا شك ، ATAN2 / ACOS / الأشياء هي المشاكل.

لكن المشكلة هي ، المحاولة والقبض لا تعمل إما لأن تلك المتغيرات المزدوجة قد نجحت في تخزين بعض القيم فيها.

وعلاوة على ذلك، فإن اتباع الحسابات لا تشكو من ذلك ولا تكسر البرنامج أبدًا!

أفكر في إجبار هذه القيمة بطريقة أو بأخرى على جعل البرنامج بأكمله يعطل ... حتى أتمكن من التقاط هذا الخطأ ..

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

أي أفكار جيدة؟

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

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

المحلول

"القيمة الغريبة" هي نان (ليس رقمًا).

المشكلة بسبب (L2*L2 - B*B - L1*L1) / (-2*B*L1) = 6.08112… خارج النطاق [-1 ، 1] حيث يتم تعريف ACOs جيدًا للأرقام الحقيقية. لذلك عاد نان.

هل أنت متأكد من أن الصيغة صحيحة؟


إذا كنت ترغب في التقاط نان ، فيجب أن يكون النان نانًا. لـ GCC ، تجميع مع -fsignaling-nans اختيار.

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