[英]How do I alternate the sign of a summation series
从 1 开始一个变量。
int coeff = +1;
然后:
sum += coeff * num/den;
coeff *= -1; // Toggles -1 to +1 and back to -1 each loop.
当coeff
为 +1 时,表达式为+1 * -1
,结果为-1
。
当coeff
为 -1 时,表达式为-1 * -1
,结果为+1
。
该变量不断在+1
和-1
之间来回切换。
让我们按照名义负担的降序讨论评论和其他答案中提出的方法。 (所谓的“名义负担”,我指的是代码字面上所说的计算,忽略了潜在的编译器优化。)
sum+=pow(-1,i)*num/den
。 这调用pow
,这是一个复杂的例程。 此解决方案涉及 function 调用和通过pow
必须处理的各种特殊情况的分支。if ((i & 1) == 0) num = -num;
. 这涉及测试、比较、分支、否定和赋值。 由于硬件设计原因,分支可能会影响性能。int coeff = +1;
, sum += coeff * num/den;
, coeff *= -1;
. 好的,现在我们走上正轨了。 我们只添加了一个变量和两个乘法。 后者甚至不必是乘法; 它可能只是coeff = -coeff;
.吸取了这些教训,我们能不能更简单地解决它呢? 是的,我们做一个简单的改变,从:
den=den*(i+2);
到:
den=-den*(i+2);
然后den
每次迭代都会在正负之间翻转,只有一个否定。 但是,我们确实需要以负值开始den
; den = -2;
.
但是,考虑一下:
den = den*(-2-i);
虽然这涉及在源代码中更改更多字符,但它可能不再起作用。 i+2
可以通过取 2 并加上i
来计算,而-2-i
可以通过取 −2 并减去i
来计算,相同的工作量。
因此,您可以使您的程序适用于交替符号,而无需比不变符号版本更多的标称工作。
int main()
{
int i=1,n, sign = 1;
float sum,num,den;
den=2;
sum=0;
printf("Enter number of terms for summation: ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
num=i*(i+1);
den=den*(i+2);
sum+=sign * num/den;
sign *= -1;
}
printf("%f",sum);
}
当x = i % 2
在 0 和 1 之间交替时,您有两个包含两个变量的方程:
+1 = A * 0 + B
-1 = A * 1 + B
从中你可以快速推断:
B = 1
A = -2
所以你可以做的是:
const int A = -2;
const int B = 1;
...
for (i = 0; i < n; i++)
{
int x = i % 2;
int y = A * x + B;
...
sum+=y*num/den;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.