一系列的总结

Summation of a series

这是我的代码,我正在尝试计算这个系列:((-1)^n)*n/(n+1) n 从 1 开始到 5,代码无法正常工作,有人可以帮忙吗?

int main(){

    int i,n;
    double sum1;

    for (i=1; i<6; i++)

    sum1 += (pow(-1,i))*((i)/(i+1));

    cout<<sum1;

    return 0;
}

最后的正确答案必须等于-0.6166666666666667,代码无法正确计算。 我从 here 计算了序列。有什么特殊的函数可以做求和吗?

试试这个

for (i = 0; i <= 5; i++) // from 0 to 5 inclusively
    sum1 += (pow(-1, i)) * (static_cast<double>(i) / (i + 1));
  • 总是在使用前初始化变量。 double sum1 = 0;

  • ((i) / (i + 1)) 执行 整数 除法,对于任何 i.

    结果为 0
  • pow函数求-1的幂极不合理
int main() {

   int i;
   double sum1 = 0;
   double sign = -1;


   for (i = 1; i < 6; i++)
   {
      sum1 += sign * i / (i + 1);
      sign *= -1.0;
   }

   std::cout << sum1;

   return 0;
}

确保在使用变量之前对其进行初始化。你之后初始化 i 这样就可以了,但是 sum1 需要初始化:

double sum1 = 0.0;

对于求和,即使将结果赋值给double,中间结果也可能不是,整数相除会导致截断值。出于这个原因,应该使用双文字(例如 2.0 而不是 2)并且应该在适用的地方转换 i

sum1 += (pow(-1, i))*(((double)i) / ((double)i + 1.0));

最后,为了得到想要的精度,可以在打印中使用std::setprecision。最终结果可能如下所示:

int main() {
    int i;
    double sum1 = 0.0;

    for (i = 1; i < 6; i++)
        sum1 += (pow(-1, i))*(((double)i) / ((double)i + 1.0));

    std::cout << std::setprecision(15) << sum1  << std::endl;
    return 0;
}

输出:

-0.616666666666667