Решил написать программу для вычисления натурального логарифма по ряду тейлора с определенной точностью. Все как бы должно работать, но выводится nan
#include <iostream>
#include <cstdlib>
#include <math.h>
using namespace std;
int main(){
system("chcp 1251>nul");
double x; // Аргумент
cin>>x;
int n; //Точность вычисления для ряда тейлора
cin>>n;
double power = 1; //Степень аргумента
double loga = 0, add = 0, k = 1; //Переменная для хранения результата, для слагаемого и счетчик
int sign = 1; //Знак слагаемого
power = x; //Начальное значение степени аргумента
add = power; // Начальное значение слагаемого
do{
loga += add; //Набор логарифма
k++; //Обновление счетчика
sign = -sign; // Переопределение знака
add=(double)(sign*(power*=x)/k); // Пересчёт слагаемого
}while(k<=n);
cout<<"log(1+" <<x <<") = " <<loga <<endl; // Вывод результата
cout<<"log(1+" <<x <<") = " <<log(x+1) <<endl; //Проверочное значение
system("pause>nul");
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
У вас забыто главное — математика. А она говорит, что ваш ряд сходится только при |x| < 1.
А для этих значений ваша программа дает вполне осмысленные результаты.
Однако все же следует задавать при вычислении ряда не количество членов, которые надо посчитать, а требуемую точность; это более корректно, на мой взгляд.
Так что я бы делал как-то так:
double LN(double x, double eps = 1e-7)
{
double sum = x, term = x;
for(int k = 2; abs(term) > k*eps; ++k)
sum += (term *= -x)/k;
return sum;
}