Вычислить сумму (произведение) конечного ряда. Предусмотреть пропуск слагаемых (множителей), которые равны нулю или бесконечности

введите сюда описание изображенияВ даном цикле есть сумма и производная, когда указываешь значение k > 4, выдает inf , а мне нужно избавиться от него, нигде не смог найти ответ, подскажите пожалуйста. Код по-сути готов, но нужно избавится от бесконечности в U,prod,sum

    #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>


int main()
{

    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
     float U, x, k, t,i;
  printf("Введіть значення x\n");
  scanf("%f",&x);
  printf("Введіть значення k\n");
  scanf("%f",&k);
  float prod = 1;
  for(t=2;t<=k;t++)
  {
  prod *= ((t*pow(x,t))/(t-12));
  printf("prod = %5.5f\n",prod);
  if (prod == -0.000) continue;
  }
  
  float sum = 0;
  for(i=1;i<=t;i++)
  {
  sum += ((i-4)/(i-6));
  printf("sum = %5.5f \n",sum);
  if (sum == -0.000) continue;
  }
 
  U = (prod*sum);
  printf("U = %5.5f \n",U);
  

    return 0;
}

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

Автор решения: AlexGlebe

Сначала циклы должны быть вложены друг в друга, ведь граница суммы зависит от переменной t, которая участвует в цикле умножения.

for(t=2;t<=k;t++)  {
  prod *= ((t*pow(x,t))/(t-12));
  printf("prod = %5.5f\n",prod);
  if (prod == -0.000)
    continue;

// }  // цикл t

  float sum = 0;
  for(i=1;i<=t;i++)  {
    sum += ((i-4)/(i-6));
    printf("sum = %5.5f \n",sum);
    if (sum == -0.000)
      continue;
  } // цикл i

  prod *= sum ;

} // цикл t
//U = (prod*sum);
U = prod ;

Бесконечность могут дать числа где участвуют переменные t ≈ 12 и i ≈ 6. Так как происходит деление на число, близкое к нулю.
Дальше проверять надо элементы, которые дают бесконечность не простым оператором ==, а диапазоном, так как типы с плавающей точкой не могут представлять цифры точно.
В первом участке так :

if (t < 11.999f || t > 12.001f )
  prod *= ((t*powf(x,t))/(t-12.f));

И во втором :

if (i < 5.9999f || i > 6.0001f)
  sum += ((i-4.f)/(i-6.f));

Дальше надо проверять на умножение множителей, близких к нулю, но не так if (prod == -0.000). А с диапазоном и не результат умножения, а множитель.
Например так :

if ( sum < -0.00001f || sum > 0.00001f )
  prod *= sum ;

И т.д.

→ Ссылка