C中pi的无穷级数逼近不终止

时间:2018-11-06 05:19:13

标签: c pi approximation

这是我的代码,使用打印语句时,它似乎是一个无限循环:

我可以解决的一些潜在问题是整数除法,也许弄清楚算法是否终止,并且如果它始终具有正确的输出,也许我不理解C语言的某些特质导致此问题? / p>

根据我的理解,由于总和趋向于负无穷大,一旦达到epsilon精度的近似值,它将导致break语句被触发,结束算法。

#include <stdio.h>

int main()
{

  double pi, sum, epsilon;
  long long i=1;
  long long max = 2147483647;
  printf("Pleas enter the desired accuracy epsilon : ");
  scanf("%f", &epsilon);
  while (i<max){
    if (i%2 == 0){
      sum = -4.0/(2.0*i-1);
    }else if (i%2 ==1){
      sum = (4.0/(2.0*i-1));
    }
    if (sum < epsilon){
      break;
    }
    pi += sum;
  }
  printf("The value of pi approximated to epsion : %f is %f\n", epsilon, pi);
  return 0;
}

3 个答案:

答案 0 :(得分:1)

您不会在SELECT City, SUM(Sales) as Total FROM Employees Where City <> 'London' GROUP BY City 循环中增加i的值。结果,它的值始终保持为1。

在完成处理后,在while循环的结束i之前,将}递增。

初始化while的值,这样在您第一次尝试读取它们的值时就不会遇到未定义的行为。

此外,在启用适当选项的情况下(对于GCC,pi, sum, epsilon),编译器会警告您,您正在尝试将-Wall读入float

double

因此,您必须使用正确的转换说明符:warning: format '%f' expects argument of type 'float *', but argument 2 has type 'double *' [-Wformat=] scanf("%f", &epsilon); ~^ ~~~~~~~~ 语句中的%lf而不是%f

如果您对数字scanf不太确定,只想取一个大值,也可以使用2147483647(来自ULLONG_MAX)来初始化limits.h而不是对值进行硬编码。

答案 1 :(得分:1)

您需要在i循环中增加while的值。

您的循环条件while(i < max)始终得到满足(无限循环)。因此,imax的值应在循环内更改,以结束循环。

答案 2 :(得分:1)

您的代码具有未定义的行为:

  width: 50;
  height: 50;
  background-color: rgb(50, 50, 50);
  border: 6px solid rgba(50, 50, 50, 0.2);
  border-radius: 100;
  align-items: center;
  justify-content: center;

scanf("%f", &epsilon); scanf%f,而不是float *double *的正确格式为double *


您的循环条件%lf等效于while (i<max),因为while (1)i都不会在循环内更改其值。

这也意味着max始终是sum

4

sum = (4.0/(2.0*i-1));
// 4 / (2 * 1 - 1) = 4 / (2 - 1) = 4 / 1 = 4

也具有未定义的行为:pi += sum; 未初始化。