繁体   English   中英

如何交替求和级数的符号

[英]How do I alternate the sign of a summation series

我正在尝试编写以下系列的总和:

在此处输入图像描述

我不知道如何将符号从“-”替换为“+”再到“-”等等……

这是我的代码:

#include<stdio.h>

int main()
{
    int i=1,n;
    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+=num/den;
    }
    printf("%f",sum);
}

从 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM