c-程序中的无限循环,作为寻找圆周率值的练习



我有这个任务

Pi的值可以由以下产品确定

2 * 2   4 * 4   6 * 6               N * N
Pi = 2 * ----- * ----- * ----- * ... * -----------------
1 * 3   3 * 5   5 * 7         (N - 1) * (N + 1)

编写一个C程序,只要一般项大于1+10-9,就可以计算Pi的近似值。

为了解决这个问题,我写了以下代码:

#include <stdio.h>
#include <stdlib.h>
int main() {
double pi;
const double End =
1.0 + (1.0 / (10.0 * 10.0 * 10.0 * 10.0 * 10.0 * 10.0 * 10.0 * 10.0 * 10.0));
double N = 2.0;
pi = 2.0 * ((N * N) / ((N - 1.0) * (N + 1.0)));
while (pi > End) {
N += 2.0;
pi *= ((N * N) / ((N - 1.0) * (N + 1.0)));
}
printf("%lf", pi);
return 0;
}

我真的不明白事情是怎么回事。我设法只使用了double变量,并将.0添加到所有数字文字中,但程序被卡住了,在我启动它时没有给出任何值

为什么?

一个简单的解决方案是跟踪旧值,从而将循环替换为以下(需要<math.h>(

double pi_old = pi + 1e9; // initialize to large value
while (fabs(pi-pi_old) > End){
pi_old = pi; // store this
// then compute next
N += 2.0;
pi *= ((N * N) / ((N - 1.0) * (N + 1.0)));
}

此外,正如我所评论的,

const double End =
1.0 + (1.0 / (10.0 * 10.0 * 10.0 * 10.0 * 10.0 * 10.0 * 10.0 * 10.0 * 10.0));

相当于

const double End = 1.0 + ( 1.0e-9 );  // 1.0e-9 = 1.0*10^(-9)

此条件while (pi > End)不符合要求
当总乘积大于大约1时,它将循环,对于Pi的任何近似值,这将是一个无休止的循环
描述仅指最后一部分(N*N)/( (N-1) * (N+1) )大于1+一点。

因此,解决方案是单独计算最后一部分,并仅在循环条件下使用它。

(我故意不提供更多详细信息或代码,因为
我如何询问和回答家庭作业问题?
(

最新更新