我正在尝试编写一个程序,从用户读入计算2的自然对数时使用的术语数.EX:Log(2),5个术语是1/1 - 1/2 + 1/3 - 1/4 + 1/5。每个后续术语的分母增加1,并且每个术语之间的加法和减法符号交替。我似乎无法找到正确的循环设置,使其正常工作。任何帮助,将不胜感激。
答案 0 :(得分:1)
使用倍增系数从+1切换到-1,然后在迭代时再次+1,然后将当前的1 / n项乘以。
double ln2(int terms) {
double sign = 1.0
double log = 0.0;
for (double n = 1; n <= terms; n += 1.0) {
// calculate your 1/n term here
log += sign / n; // == sign * 1.0 / n
// and reverse polarity for the next iteration
sign = -sign;
}
return log;
}
注意:这个系列慢慢收敛非常!
答案 1 :(得分:1)
你取的是(-1)^ n * -1 / n之和。如果你合并两个相邻的术语
( - 1)^(2n-1)* -1 /(2n-1)+( - 1)^(2n)* -1 /(2n)= 1 /(2n-1) - 1 /( 2n)= 1 /(4 * n ^ 2 - 2 * n)
所以你可以做到
double ln2(int lim) {
double sum;
for (int n = 1; n <= lim; n++) {
sum += 1.0/n/(4*n - 2);
}
return sum;
}
这仍然不快,但其收敛行为更好。
答案 2 :(得分:0)
您可以拥有一个单独的变量n
,每次添加一个变量,检查它是否与if (n%2 == 0)
相同。如果是这样,请将分母乘以-1。