@SPLATHER

Какой кусок кода дописать, чтобы вычислить логарифм с заданной точностью?

Вот код в Visual Studio 17.
#include
#include
#include

double sum = 0;
double x;
using namespace std;

int main(void)
{
setlocale(LC_ALL, ".1251");
cout << "Введите х: ";
cin >> x;
if (x >= 0 && x <= 2)
{
x -= 1;

for (int i = 1; i < 5000; i += 2)
{
sum += (pow(x, i) / (double)i - pow(x, i + 1) / (double)(i + 1));
}

cout << (sum);
}
else if (x > 2)
{
x = (x / (x - 1));

for (int i = 1; i < 1000; i++)
{
sum += 1.0 / (i*pow(x, i));
}

cout << (sum);
}
else
{
cout << ("Воу, воу. А давно сумма ряда с отрицательных чисел начинается?");
}
}

Если я вообще правильно сделал, то здесь вычисляется логарифм с помощью разложения в ряд. Даже если и не поможете напрямую, то хоть намекните в каком направлении шагать.
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 1
longclaps
@longclaps
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, следует посчитать логарифм (как сумму ряда) для обратной величины, ну и знак поменять, конечно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы