Как уже упоминалось в комментарии, вы получаете неправильные результаты из-за переполнения. Факториал особенно подвержен переполнению, потому что растет очень быстро. Дело в том, что, небрежно говоря, этот экстремальный рост и делает сходство рядов Тейлора. Если учесть полный термин, который вы добавляете на каждой итерации, он фактически идет к 0
, а не к бесконечности (факториал - знаменатель).
Вместо вычисления степеней x
и факториала в отдельности, вы должны просто обновлять полный термин, т.е. вместо
sum = sum + (pow(a, c) / fact(c));
// ^ this may grow very fast
// ^ this definitely grows extremely fast
вы должны сделать что-то вроде
double add = x;
double factor = 1;
while (add > eps) { // with some appropriate value for eps
sum += add;
add *= (x / factor); // <-- this will nicely converge to 0
factor++;
}
, как указывали другие, на самом деле это ряд Тейлора для экспоненты, но вам нужны лишь незначительные изменения, чтобы получить желаемый результат (например, пропустить нечетные).