سؤال

لقد خلق الخطيئة وظيفة من الصفر في شركات علوم الصف و أنا أقترب من التوصل إلى حل.ومع ذلك أنا لا تزال تواجه بعض المشاكل.إذا وضعت في القيمة .5PI أو أقل يعمل, لكن على خلاف ذلك أحصل على نتيجة غير صحيحة.هنا هو رمز لدي حتى الآن:

double i=1;
double sinSoFar = 0;
int term = 1;
while(i >= .000001)
{
    i = pow(-1, term + 1) * pow(sinOf, 2*term-1) / factorial(2*term-1);
    sinSoFar=sinSoFar + i;
    term++;
}
هل كانت مفيدة؟

المحلول

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

public static long factorial(long n) {
        if      (n <  0) throw new RuntimeException("Underflow error in factorial");
        else if (n > 20) throw new RuntimeException("Overflow error in factorial");
        else if (n == 0) return 1;
        else             return n * factorial(n-1);
} 

نصائح أخرى

بعض النصائح:

  • تبدأ مع المدى = 0.الكنسي MacLaurin التوسع أيضا لا
  • حساب القوى مضروب بينما كنت ركوب الدراجات (وهذا هو ، تحديثها في كل خطوة).ربما المشكلة هي في الأسرى() أو مضروب().

تحرير.اقتراح:مرة واحدة لديك حساب ك-ال الأجل ، يمكنك حساب (ك+1)-ال أحد من قبل:

  • ضرب من قبل (-1)
  • ضرب من قبل sinOf^2
  • قسمة (2k+2)(2k+3)

في هذه الطريقة يمكنك تماما تجنب حساب القوى factorials.

وبقدر القيم خارج 0 - 1 / 2PI، كل ما يمكن حسابها من القيم داخل النطاق

// First, normalize argument angle (ang) to -PI to PI, 
// by adding/subtracting 2*PI until it's within range
if ( ang > 1/2PI ) {
    sin = sin ( PI - ang );
}
else if ( ang < 0 ) {
    sin = -1 * sin( -1 * ang );
}
else {
    // your original code
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top