2

我有这个任务

Pi的值可以由以下乘积确定

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

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

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

#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到所有数字文字中,但是程序被卡住并且在我启动它时没有给出任何值。

为什么?

4

2 回答 2

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)
于 2021-01-12T18:39:39.733 回答
0

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

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

我故意不提供更多细节或代码,因为
我如何问和回答作业问题?

于 2021-01-13T15:36:04.167 回答