[英]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)
始終會滿足(無限循環)。 因此, i
或max
的值應在循環內更改,以結束循環。
您的代碼具有未定義的行為:
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;
也具有未定義的行為: pi
未初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.