Проблемы при вычислении значения синуса с рядом Тейлора

я пытаюсь рассчитать

sin x

Используя следующий код.

#define PI 3.14
double ans;
double input1;

void toRad() {
    input1 = input1 * PI / 180.0;
}

void sine(void) {
    toRad();
    ans = input1;
    int i = 1;
    for (; i < 15; i++) {
        if (i % 2 == 0)
            ans = ans + (ans * input1 * input1) / 2 * i * (2 * i + 1);
        else
            ans = ans - (ans * input1 * input1) / 2 * i * (2 * i + 1);
    }
    printf("%lf", ans);
}

Я использовал итерационные операции вместо pow и факториальных функций, чтобы получить более точные значения и больше итераций.

Но по какой-то причине я получил разные результаты, такие как -4000000E. В чем может быть проблема этого кода?


person Şahin Olut    schedule 14.04.2015    source источник
comment
И в чем проблема?   -  person Bruno Toffolo    schedule 15.04.2015
comment
Омг, забыл задать вопрос, он выводит значения вроде 2400000, что не так с этим кодом   -  person Şahin Olut    schedule 15.04.2015
comment
Почему ans является глобальной переменной? разве вы не можете просто вернуть его из sine?, как это делает функция sin()?   -  person Iharob Al Asimi    schedule 15.04.2015
comment
Потому что это только часть моей программы - это облегчает мою остальную программу - конечно, возврат можно использовать, но я не думаю, что это изменит результат.   -  person Şahin Olut    schedule 15.04.2015
comment
Рассмотрите возможность использования M_PI из math.h (просто чтобы не изобретать велосипед). Кроме того, вы можете переписать свою функцию toRad() следующим образом: double toRad(double in) { return in * PI / 180.0; }   -  person Sam Protsenko    schedule 15.04.2015
comment
вы ставите скобки для группировки факторов числителя, но не факторов знаменателя, поэтому вы действительно оцениваете выражение (ans*input1*input1)*(i*(2*i + 1)) / 2, также группируйте факторы в знаменателе.   -  person Luis Colorado    schedule 15.04.2015


Ответы (1)


вы допустили небольшую ошибку в написании логики. проверьте себя, пока i=4.

     if (i % 2 == 0)
        ans = ans + (ans * input1 * input1) / 2 * i * (2 * i + 1);
    else
        ans = ans - (ans * input1 * input1) / 2 * i * (2 * i + 1);

вместо этого вы должны создать факториальную функцию, чтобы ее можно было заменить на

    if (i % 2 == 0)
        ans = ans + (ans * input1 * input1) / factorial(2 * i + 1);
    else
        ans = ans - (ans * input1 * input1) / factorial(2 * i + 1);
person Yash Bansal    schedule 14.04.2015