Ряд Тейлора выводит 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 шт):

Автор решения: S.H.

Проблема в преобразованиях типов.

Посмотрим на строку

    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 - примените преобразование типа в явном виде.

Но есть еще более простая и "смешная" проблема: Вы в функции нигде не возвращаете посчитанного значения.

Компилятор при этом выдаёт вам предупреждение, но, видимо, Вы не обратили на это внимания

Ну, и у Вас в функции неинициализированные переменные - как говорится, "типичная ошибка новичка". А неинициализированные переменные приводят к неопределенному поведению.

→ Ссылка
Автор решения: Igor
  1. double epsilon (int n, double x, double k)

  2. k+1*k+3 - в каком порядке будут выполнены действия?

  3. Вычисления, конечно, неправильные. Вы что, не видите, что количество множителей в числителе и знаменателе растет?

→ Ссылка
Автор решения: Harry

В дополнение к предыдущим ораторам :)

Вам и вовсе не нужны эти вычисления с 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;
}

Результат работы программы здесь.

→ Ссылка