Пытаюсь вычислить по формуле ln2 с заданным n

Рейтинг: 0Ответов: 1Опубликовано: 30.06.2023

Чем отличается мой код от кода, найденного мною тут. И как сделать так, что бы вычислить в последовательности, к примеру , от n= 6, до n =74.

#include <iostream>
#include <math.h>

using namespace std;

    int main(){   
    int n;
    double res1 =0;
    double res =1;
    cin >> n;

    for (int i=1;i<=n;i++){
        res1 += (pow(-1,i+1))/i;     
    }
  cout << res1;
    return 0;
}

Ответы

▲ 4Принят

Ну, по ссылке вообще кромешный ужас...

У вас чуть меньший, но... Вы считаете по формуле

введите сюда описание изображения

(которая сходится для x из (-1,1], но для x == 1 делает это очень медленно, для точности n знаков надо 10n слагаемых...)

Даже так вид формулы наводит на совершенно иной код (ладно, пусть, как у вас, для количества членов...):

for (int i = 1; i <= n; i++) res += ((i%2)? +1.0 : -1.0)/i;

или

for(int i = 1; i <= n; i++) res += ((i%2)*2 - 1.0)/i;

или, если все это кажется высшей математикой :) хотя бы

for(int i = 1, sign = -1; i <= n; i++) res += double(sign = -sign)/i;

Но стоит дописать рядом

введите сюда описание изображения

и вычислить разность, как получается ряд, сходящийся для x из (-1,1), т.е. для любого аргумента под знаком логарифма:

введите сюда описание изображения

Чтобы получить логарифм двойки, надо подставить x = 1/3...

Получаем код типа

int n;
double res = 0;
cin >> n;
double x = 1./3, term = x;
for(int i = 1; i <= 2*n; i+=2)
{
    res += term/i;
    term *= x*x;
}
cout << 2*res;

Но лучше задавать не количество членов, а точность (последний член ряда должен быть меньше этого значения):

double eps = 1e-6, x = 1./3, term = x, res = term;
x*=x;
for(int i = 3; abs(term) > eps; i+=2) res += (term *=x) /i;
res *= 2;

cout << res;