Пытаюсь вычислить по формуле ln2 с заданным n
Чем отличается мой код от кода, найденного мною тут. И как сделать так, что бы вычислить в последовательности, к примеру , от 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;
}
Ответы (1 шт):
Ну, по ссылке вообще кромешный ужас...
У вас чуть меньший, но... Вы считаете по формуле
(которая сходится для 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;


