簡體   English   中英

C中pi的無窮級數逼近不終止

[英]Infinite series approximation of pi in C not terminating

這是我的代碼,當使用打印語句時,它似乎是一個無限循環:

我可以解決的一些潛在問題是整數除法,也許弄清楚算法是否終止,並且如果它始終具有正確的輸出,也許是我不理解的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的值,以便在首次嘗試讀取它們的值時不會遇到未定義的行為。

同樣,啟用適當的選項(帶有GCC的-Wall ),編譯器會警告您,您正在嘗試將float讀為double

warning: format '%f' expects argument of type 'float *', but argument 2 has type 'double *' [-Wformat=]

   scanf("%f", &epsilon);

          ~^   ~~~~~~~~

因此,您必須使用正確的轉換說明符: scanf語句中使用%lf代替%f

如果您對數字2147483647 ULLONG_MAX ,只是想要一個大值,則還可以使用ULLONG_MAX (來自limits.h )來初始化max而不是硬編碼該值。

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

您的循環條件while(i < max)始終會滿足(無限循環)。 因此, imax的值應在循環內更改,以結束循環。

您的代碼具有未定義的行為:

scanf("%f", &epsilon);

scanf %f采用float * ,而不是double * double *的正確格式是%lf


您的循環條件while (i<max)等於while (1) ,因為imax都不會在循環內更改其值。

這也意味着sum始終為4

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

pi += sum;

也具有未定義的行為: pi未初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM