π在C中的无穷级数逼近

π在C中的无穷级数逼近,c,pi,approximation,C,Pi,Approximation,这是我的代码,当使用print语句时,它似乎是一个无限循环: 我可以解决的一些潜在问题是整数除法,也许可以找出算法是否终止,如果它总是有正确的输出,也许是C语言的某些特性导致了这个问题 根据我的理解,由于求和趋于负无穷大,一旦达到epsilon精度的近似值,就会触发break语句结束算法 #include <stdio.h> int main() { double pi, sum, epsilon; long long i=1; long long max = 214

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

我可以解决的一些潜在问题是整数除法,也许可以找出算法是否终止,如果它总是有正确的输出,也许是C语言的某些特性导致了这个问题

根据我的理解,由于求和趋于负无穷大,一旦达到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;
}

您不能在while循环中增加i的值。因此,其值始终保持为1

在while循环的}关闭之前完成处理后的增量i

初始化pi、sum、epsilon的值,以便在第一次尝试读取它们的值时不会遇到未定义的行为

此外,如果启用了正确的选项-Wall with GCC,编译器将警告您,您正在尝试将浮点读入双精度浮点

因此,您必须在scanf语句中使用正确的转换说明符:%lf而不是%f

如果您对数字2147483647不是很挑剔,只是想要一个较大的值,您也可以使用limits.h中的ULLONG_MAX来初始化MAX,而不是硬编码该值。

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


你的循环条件whilei您的代码具有未定义的行为:

scanf("%f", &epsilon);
scanf%f采用浮点*,而不是双精度*。double*的正确格式为%lf


你的循环条件,而我你从来没有增加使用for循环,那么这样的错误更容易发现。感谢反馈,我在循环中添加了增量,但是最终的awnser仍然是4.0,我将继续进行故障排除。如果你使用C99或更新版本,printf%lf毫无意义,它相当于%f。如果您使用的是C90,printf%lf有未定义的行为。请停止以使现有答案无效的方式更改您的问题。是的,似乎总和始终为4,正确,我将尝试修复此问题。保证最大值不为2147483647。算术仍然无法正常工作however@BenFrench:您是否已初始化pi、sum、,epsilon在开始?是的,我已经初始化了它并修复了算法,它现在可以工作了,但是它只显示到小数点后6位,我正在扩展显示的浮点小数,谢谢你到目前为止的帮助
scanf("%f", &epsilon);
sum = (4.0/(2.0*i-1));
// 4 / (2 * 1 - 1) = 4 / (2 - 1) = 4 / 1 = 4
pi += sum;