Задача c++. Операторы цикла: вычисления с заданной точностью

Необходимо реализовать формулу на c++ с помощью циклов while, do while, и for.

В чем проблема? Как помочь? Что пробовали, что получилось?

//Циклические вычисления с заданной точностью. Пример.
//Вычислить предел последовательности {y[n]}.
//Значения y[0], y[1], y[2] и точность eps вводятся с клавиатуры.
//Вычисления закончить при |y[n]-y[n-1]| <= eps.
//Вывести результат и число итераций.
#include<iostream>
#include<cmath>
#include<limits.h>
#include<locale.h>
using namespace std ;
double predel_1(double, double, double, double, int&n) ;
double predel_2(double, double, double, double, int&n) ;
double predel_3(double, double, double, double, int&n) ;

//main_begin___________________________________________________________________
int main()
{int var,
     n1, n2, n3 ;		//число итераций для разных циклов
 double re1, re2, re3,	//результаты расчетов
	y,			//значение предела
	y0, y1, y2 ;	//текущие значения элементов последовательности
 double eps ;		//точность вычисления предела
 setlocale(LC_ALL,"Russian") ;
 for(;;)
 {//Ввод исходных данных
  cout << " Вид действия:" << endl ;
  cout << " 1 - вычисление предела последовательности" << endl ;
  cout << " 2 - завершение задачи" << endl ;
  cout << " Введите вид действия -> " ;
  cin >> var ;
  switch(var)
    {case 1:
//Ввод исходных данных
       cout << " Введите значения y0, y1, y2 -> " ;
       cin >> y0 >> y1 >> y2 ;
       cout << " Введите точность вычисления -> " ;
       cin >> eps ;
       if(eps <= 0 || eps > .1)
	   {cout << "Ошибка ввода. Значение eps д.б. >0 и  <=0.1" << endl ;
	    continue ;
	   }
//Решение циклом while
       re1 = predel_1(y0, y1, y2, eps, n1 = 3) ;
       if(n1 != INT_MAX)
	  {cout.precision(4) ; 	//число знаков после десятичной точки
	   cout << "Для цикла WHILE рез.    = " << re1 << " n = " << n1 << endl ;
	  }
       else cout << "Для цикла WHILE точность не достигнута" << endl ;
//Решение циклом do..while
       re2 = predel_2(y0, y1, y2, eps, n2 = 2) ;
       if(n2 != INT_MAX)
	  {cout.precision(4) ; 	//число знаков после десятичной точки
	   cout << "Для цикла DO..WHILE рез.= " << re2 << " n = " << n2 << endl ;
	  }
       else cout << "Для цикла DO..WHILE точность не достигнута" << endl ;
//Решение циклом for
       re3 = predel_3(y0, y1, y2, eps, n3 = 3) ;
       if(n3 != INT_MAX)
	  {cout.precision(4) ; 	//число знаков после десятичной точки
	   cout << "Для цикла FOR рез.      = " << re3 << " n = " << n3 << endl ;
	  }
       else cout << "Для цикла FOR точность не достигнута" << endl ;
       break ;
     default: return 0 ;
    }//switch
 }//for
}
//main_end_____________________________________________________________________

//predel_1_beg__________________________________________________________________
//вычисление предела последовательности циклом while
double predel_1(double y0, double y1, double y2, double eps, int&n)
{double y = (atan(n * n - 3.) + 1.5 * y2) / (sqrt(cos(n*n + 1.)) + y0 * y0 + 2.);
 while(fabs(y - y2) > eps && n < INT_MAX)
   {y0 = y1 ;
    y1 = y2 ;
    y2 = y ;
    n++ ;
   y = (atan(n * n - 3.) + 1.5 * y2) / (sqrt(cos(n*n + 1.)) + y0 * y0 + 2.);
   }
 return y ;
}
//predel_1_end__________________________________________________________________

//predel_2_beg__________________________________________________________________
//вычисление предела последовательности циклом do..while
double predel_2(double y1, double y2, double y, double eps, int&n)
{double y0 ;
 do{y0 = y1 ;
    y1 = y2 ;
    y2 = y ;
    n++ ;
   y = (atan((n * n) - 3.) + 1.5 * y2) / (sqrt(cos((n* n) + 1.)) + (y0 * y0) + 2.);
   }
 while (fabs(y - y2) > eps && n < INT_MAX) ;
 return y ;
}
//predel_2_end__________________________________________________________________

//predel_3_beg__________________________________________________________________
//вычисление предела последовательности циклом for
double predel_3(double y0, double y1, double y2, double eps, int&n)
{double y = (atan(n * n - 3.) + 1.5 * y2) / (sqrt(cos(n*n + 1.)) + y0 * y0 + 2.);
 for( ; fabs(y - y2) > eps && n < INT_MAX ; )
    {y0 = y1;
     y1 = y2;
     y2 = y;
     n++ ;
     y = (atan(n * n - 3.) + 1.5 * y2) / (sqrt(cos(n*n + 1.)) + y0 * y0 + 2.);
    }
 return y ;
}
//predel_3_end__________________________________________________________________

Программа выводит “nan” вместо искомых значений

Модуль (fabs - C++ Reference) пропущен и тут может получиться отрицательное число

от которого не получить корень.

не очень понимаю где именно я должен воткнуть этот fabs

там, где в формуле )

image

к результату cos.

fabs(cos(...