Решил написать программу для вычисления натурального логарифма по ряду тейлора с определенной точностью. Все как бы должно работать, но выводится 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;
}
→ Ссылка