Ряд Тейлора выводит 0
Не могу понять как реализовать ряд Тейлора, прога всегда 0 выводит.
Вот условие:

Вот попытка:
#include <iostream>
#include <cmath>
using namespace std;
double epsilon (int n, int x, int k)
{
double sum ;
double sum_1;
while (sum_1 < 0.1e-5)
{
for (int i = 0; i < n; i++)
{
k++;
sum += (double)(pow(x,k+2)) / (double)(((k+1*k+3)/(k+2*k+4)));
sum_1*=(double)sum;
}
}
return sum_1;
}
int main()
{
int n, x, k = 1;
cin >> n >> x;
cout << epsilon (x,k,n);
}
Ответы (3 шт):
Проблема в преобразованиях типов.
Посмотрим на строку
sum += pow(x,k+2)/((k+1*k+3)/(k+2*k+4));
Там в правой части в знаменателе используются только целые числа. Это означает, что будет выполнена операция деления одного целого числа на другое целое.
Очевидно, это не совсем то, что Вы хотите сделать.
Имеет смысл прибегнуть к принудительному преобразованию типов, что то вроде
sum += (double)(pow(x,k+2)) / (double)(((k+1*k+3)/(k+2*k+4)));
Ну, и во всех местах, где Вам нужно получить по смыслу double из int - примените преобразование типа в явном виде.
Но есть еще более простая и "смешная" проблема: Вы в функции нигде не возвращаете посчитанного значения.
Компилятор при этом выдаёт вам предупреждение, но, видимо, Вы не обратили на это внимания
Ну, и у Вас в функции неинициализированные переменные - как говорится, "типичная ошибка новичка". А неинициализированные переменные приводят к неопределенному поведению.
double epsilon (int n, double x, double k)k+1*k+3- в каком порядке будут выполнены действия?Вычисления, конечно, неправильные. Вы что, не видите, что количество множителей в числителе и знаменателе растет?
В дополнение к предыдущим ораторам :)
Вам и вовсе не нужны эти вычисления с pow (впрочем, совершенно неверные — вы пытались вычислять очередной член просто как
что, как вы понимаете, совершенно не то, что написано в условии... но даже в этом случае надо писать скобки, так как приоритет умножения, как учат еще в начальной школе, выше приоритета сложения) — каждый следующий член легко вычисляется из предыдущего:
double arcsin(double x, double eps = 1e-7)
{
double term = x, sum = term;
x *= x;
for(int k = 1; abs(term) > eps; k+=2)
sum += (term *= x*k/(k+1))/(k+2);
return sum;
}
int main()
{
for(double x = 0; x < 0.8; x += 0.1)
cout << asin(x) << " " << arcsin(x) << endl;
}
Результат работы программы здесь.
