【问题标题】:Summation of a series [duplicate]一个系列的总和[重复]
【发布时间】:2019-02-20 10:50:11
【问题描述】:

这是我的代码,我正在尝试计算这个系列:((-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 计算了系列。有什么特殊的函数可以求和吗?

【问题讨论】:

  • 这行得通吗? sum1 += (pow(-1.0,i))*(((double)i)/((double)i+1.0)); 你还需要初始化你的变量,所以double sum1; 应该是double sum1 = 0.0;
  • i 的类型为 int。因此,(i)/(i+1) 是一个整数除法。您可以通过例如解决此问题(double)(i)/(i+1) 强制使用浮点数完成参数(以及整个除法)。
  • 你的循环是从 1 开始的,不应该是从 0 开始吗​​?
  • 您的 sum1 在使用前没有初始化!
  • @Blaze:你为什么不发布所有这些作为答案?

标签: c++ integer-division


【解决方案1】:

确保在使用变量之前对其进行初始化。之后你初始化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.61666666666667

【讨论】:

    【解决方案2】:
    • 始终在使用前初始化变量。 double sum1 = 0;

    • ((i) / (i + 1)) 执行整数除法,结果是0 对任何i

    • 使用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;
    }
    

    【讨论】:

      【解决方案3】:

      试试这个

      for (i = 0; i <= 5; i++) // from 0 to 5 inclusively
          sum1 += (pow(-1, i)) * (static_cast<double>(i) / (i + 1));
      

      【讨论】:

      • 一些解释在这里可能有用。不过(还)不是我的反对票。
      猜你喜欢
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 2023-04-06
      • 2018-12-15
      • 2018-08-07
      • 2013-03-04
      • 1970-01-01
      • 2018-05-14
      相关资源
      最近更新 更多