Проверил на онлайн калькуляторе... вроде погрешности округления небольшие (нас учили что если точность имеет N знака после запятой, то округляем до N+1 знаков)
Все переменные по вашей формуле названы
var exp = 0.001; // точность
var summ = 0; // переменная для суммы
var count ; // переменная для кол-во соагаемых
//считает одно слагаемое
function get_value(x, a, k)
{
return +( Math.sin( Math.pow(x, k)) / ( Math.pow(a, 2*k) * fac(2*k) ) ).toFixed(4);
}
// считает сумму
function Summ(x, a, k)
{
if(k == 1)//при первом витке сравнивать на точность еще нечего
{
return get_value(x, a, k) + Summ(x, a, k+1);
}
else{
if( Math.abs(get_value(x, a, k) - get_value(x, a, k-1)) > exp ) // |An – An-1| > exp, пока это выражение
{ // истинно, вычисления продолжаются.
return get_value(x, a, k) + Summ(x, a, k+1);
}
else{
count = k;
return get_value(x, a, k);
}
}
}
// (2k) не может быть отричательным,
// поэту проверку на отрицательность не делал
function fac(num)
{
if(num == 1 || num == 0)
{
return 1;
}
return num * fac(num - 1);
}
alert("Сумма = " + Summ(15, 2, 1) +"\nЧисло циклов(при точности " + exp + ") равно : " + count);