алгоритм — Нахождение натурального логарифма числа с использованием ряда Тейлора в переполнении стека

Конкретный вопрос

Итак, последние 2 часа я потратил на это, 100 раз подправил код, но ничего не получил. Нет ошибок и предупреждений, но ответ неверен. Вот мой код:

#include <iostream>
using namespace std;

void main()
{
/***********Variable Declarations************/

double count = 1, totalValue = 0, it, x, z=1, powe = 1, y;

cout << "Iterations=";
cin >> it;
cout << "x=";
cin >> x;
/***************End User Input***************/

while (count <= it)
{
for (int i = 0; i < powe; i++) {
z *= (x - 1) / (x + 1);
}
y = (1 / powe)*z;

totalValue = totalValue + y;
powe = powe + 2;
count++;
}

cout << "The Result is:" << 2*totalValue << endl;
}

Я знаю, что это проблема логики (математики), но я не могу ее найти. Спасибо.

Изменить: нам не разрешено использовать любую другую библиотеку.

2

Решение

Вы забыли установить z до 1 в каждой итерации вашего while:

#include <iostream>
using namespace std;void main()
{
/***********Variable Declarations************/

double count = 1, totalValue = 0, it, x, z=1, powe = 1, y;

cout << "Iterations=";
cin >> it;
cout << "x=";
cin >> x;
/***************End User Input***************/while (count <= it)
{

for (int i = 0; i < powe; i++) {
z *= (x - 1) / (x + 1);
}
y = (1 / powe)*z;

totalValue = totalValue + y;
powe = powe + 2;
count++;
z = 1; //Without this line you will have very high powers
}

cout << "The Result is:" << 2*totalValue << endl;

}

РЕДАКТИРОВАТЬ:

Вы можете оптимизировать свой подход без необходимости постоянно вычислять мощность с нуля:

#include <iostream>
using namespace std;void main()
{
/***********Variable Declarations************/

double count = 1, totalValue = 0, it, x, z, powe = 1, y;

cout << "Iterations=";
cin >> it;
cout << "x=";
cin >> x;
z = (x + 1) / (x - 1); //We start from power -1, to make sure we get the right power in each iteration;
//Store step to not have to calculate it each time
double step = ((x - 1) * (x - 1)) / ((x + 1) * (x + 1));
/***************End User Input***************/while (count <= it)
{

z * = step;
y = (1 / powe)*z;

totalValue = totalValue + y;
powe = powe + 2;
count++;
//We no longer need to set z to 1, as the previous value becomes useful
}

cout << "The Result is:" << 2*totalValue << endl;

}
1

Другие решения

Ваш метод неэффективен, а реализация неверна.

Это неправильно, потому что ваш внутренний цикл для расчета 2Nсила сломлена Вам нужно сбросить z 1 каждый раз перед внутренним циклом.

Но не делайте этого, вам вообще не нужен внутренний цикл.

Для того, чтобы рассчитать Nчлен серии, вам не нужно рассчитывать 2N-я сила того же старого числа с самого начала. Вы только что рассчитали 2N-2Эта сила этого числа на предыдущем шаге. Используй это.

4

По вопросам рекламы [email protected]