for (int i = 1; i < 5000; i += 2) {
sum += (pow(x, i) / (double)i - pow(x, i + 1) / (double)(i + 1));
// смотрите, здесь у вас скомбинированы слогаемые разного знака.
// но, если их растащить, получится сходящийся знакопеременный ряд,
// а погрешность по модулю не превышает второе слогаемое.
}
// как-то так
double first, second = 1;
for (int i = 1; abs(second) > epsilon; i += 2) {
first = pow(x, i) / (double)i;
second = pow(x, i + 1) / (double)(i + 1);
sum += first - second;
}
update
чота ответ плюсуют безоглядно, и хоть бы кто сообразил, что ряд знакопеременный лишь при
x>0
.
Для
x<0
, т.е. для аргумента логарифма
(1+х)<1
, следует посчитать логарифм (как сумму ряда) для обратной величины, ну и знак поменять, конечно.