Неправильно вычисляется произведение ряда

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
   double x, sm = 1;
   int n;
   cin >> n >> x;
   for (int i = 1; i <= n; i++) {
      sm *= (i/(i+1) - pow(cos(abs(x)), i));
   }
   cout.precision(6);
   cout << fixed << sm << endl;
}

Я просто не понимаю, что у меня не так с кодом, чего только не перепробовал.введите сюда описание изображения


Ответы (2 шт):

Автор решения: Motilyok
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
   double x, sm = 1;
   int n;
   cin >> n >> x;
   for (double i = 1; i <= n; i++) {
      sm *= (i/(i+1) - pow(cos(abs(x)), i));
   }
   cout.precision(6);
   cout << fixed << sm << endl;
}

Деление должно быть не целочисленным

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

Целочисленное деление даёт ноль, нужно заставить выполняться вещественное. При этом индекс цикла не нужно делать вещественным.

for (int i = 1; i <= n; i++) {
   sm *= (double(i)/(i+1) - pow(cos(abs(x)), i));
}

Кроме того, можно сделать небольшую оптимизацию - не потребуется на каждом шаге вычислять косинус и степень (тяжёлые операции)

double cospow = cosx = cos(abs(x);

for (int i = 1; i <= n; i++) {
   sm *= (double(i)/(i+1) - cospow);
   cospow *= cosx;
}
→ Ссылка