Факториалы легко вычислить, ведь n! является просто произведением всех чисел до п. Но есть практическая проблема: Factorials overflow pretty quickly. 32-битный int может содержать 12 !, 64-битный int 20 !.
В зависимости от того, как ваша серия сходится, вы можете переполнить допустимый диапазон.
С приближением серии, как ваша, как правило, лучше, чтобы найти средства для представления термин K с помощью термина к − 1. В вашем случае:
term = pow(-1, k) * pow(x, 2*k)/fact(2*k)
вы можете представлять термин как
term[k + 1] = -term[k] * pow(x, 2)/((2*k - 1) * (2*k - 2))
и ваша серия становится:
double f(double x)
{
double term = 1.0;
double res = term;
int k = 0;
while (k < 100) {
double old = res;
term = -term * (x/(2*k + 1)) * (x/(2*k + 2));
res += term;
if (res == old) break;
k++;
}
return res;
}
Эта функция будет использовать в большинстве 100 итераций для вычисления косинуса. Он останавливается, когда этот термин не способствует результату.На практике он достигает результата с примерно 10 итерациями, поэтому в этом случае регулярные факториальные вычисления были бы достаточно точными. Тем не менее, вычисление их снова и снова является расточительным.
Там отсутствует встроенный в стандартной функции, вам нужно написать свою собственную факториальную реализацию. –
Не могли бы вы дать мне указание на то, как я смогу это сделать? – DanielRossi
Один из способов: используйте 'for'loop от' 1' до '2K' и разделите термин' term' на каждый номер. –