繁体   English   中英

在 C 语言中,如何计算得到 pi=3.14、pi=3.141、pi=3.1415 和最后 pi=3.14159 的无限级数的项数?

[英]In C language how to calculate the term number of infinite series where we get pi=3.14, pi=3.141,pi=3.1415 and finally pi=3.14159?

问题是:从无限级数中计算出 π 的值。 打印一张表格,显示用该级数的一项、两项、三项等近似的 π 值。 在您第一次获得 3.14 之前,您必须使用这个系列的多少项? 3.141? 3.1415? 3.14159?

int n = 2;
double sum,
 pi = 4,
    den;

printf("Calculating the value of pi.\n");
while (pi != 3.140000) {
    if (n % 2 == 0) {
        den = (2 * n) - 1;
        sum = (4.0 / den);
        pi = pi - sum;
    }
    else {
        den = (2 * n) - 1;
        sum = (4.0 / den);
        pi = pi + sum;
    }
    pi = (round(pi * 100)) / 100;
    printf("pi=%lf\n", pi);
    if (pi == 3.140000) {
        break;
    }
    n = n + 1;
}

printf("The number of terms to get pi=3.14 is %d.\n", n - 2);

此代码有效,并表明我们将在第 30 学期获得 3.14,但是当我重复此代码以获取 pi=3.141、pi=3.1415 和 pi=3.14159 的学期编号时,代码不起作用并且在执行时仅显示黑色屏幕上有语句,计算 pi 的值。 这不是我想要的确切 output,但有点像。 实际上我希望表格打印到我得到 3.14,然后我应该得到显示术语编号的语句,我得到 3.14,表格从我离开的地方开始,一旦我得到 3.141,语句显示术语编号在那里我得到 3.141 版画等等。 请在这方面帮助我。(使用 C 语言)(我必须在不使用 prec、trunc 或其他一些功能的情况下执行此操作,因为我不允许这样做)

编辑:我这样做了:

int
main()
{
    int n = 2,
        x = 2,
        y = 2,
        z = 2;
    double sum,
     pi = 4;

    printf("Calculating the value of pi.\n");
    while (pi != 3.140000) {
        if (n % 2 == 0) {
            sum = (4.0 / ((2 * n) - 1));
            pi = pi - sum;
        }
        else {
            sum = (4.0 / ((2 * n) - 1));
            pi = pi + sum;
        }
        pi = (round(pi * 100)) / 100;
        if (pi == 3.140000) {
            break;
        }
        n = n + 1;
    }
    while (pi != 3.141000) {
        if (n % 2 == 0) {
            sum = (4.0 / ((2 * n) - 1));
            pi = pi - sum;
        }
        else {
            sum = (4.0 / ((2 * n) - 1));
            pi = pi + sum;
        }
        pi = (round(pi * 100)) / 100;
        if (pi == 3.141000) {
            break;
        }
        n = n + 1;
    }
    while (pi != 3.141500) {
        if (n % 2 == 0) {
            sum = (4.0 / ((2 * n) - 1));
            pi = pi - sum;
        }
        else {
            sum = (4.0 / ((2 * n) - 1));
            pi = pi + sum;
        }
        pi = (round(pi * 100)) / 100;
        if (pi == 3.141500) {
            break;
        }
        n = n + 1;
    }
    while (pi != 3.141590) {
        if (n % 2 == 0) {
            sum = (4.0 / ((2 * n) - 1));
            pi = pi - sum;
        }
        else {
            sum = (4.0 / ((2 * n) - 1));
            pi = pi + sum;
        }
        pi = (round(pi * 100)) / 100;
        if (pi == 3.141590) {
            break;
        }
        n = n + 1;
    }
    printf("The number of terms to get pi=3.14 is %d.\n", n - 2);
    printf("The number of terms to get pi=3.141 is %d.\n", n - 2);
    printf("The number of terms to get pi=3.1415 is %d.\n", n - 2);
    printf("The number of terms to get pi=3.14159 is %d.\n", n - 2);
}

但屏幕显示没有 output。

while ( pi.= 3.140000 )要求您已经知道答案。 如果你这样做了,你为什么要计算pi呢?

你应该使用的是像

double precision = 0.01;
double pi = 4;
while ( 1 ) {
   double previous_pi = 4;

   # Refine the value of `pi` here...

   if ( fabs( previous_pi - pi ) < precision / 2 )
      break;
}

这给了我们你问题的答案。 只需改变0.01即可获得不同的精度。

当您正在寻找诸如“3.14100”之类的值时,明显永无止境的过程的原因是您需要为更多的小数位提高舍入精度。 在您的代码中,此语句使您感到困惑。

pi=(round(pi*100))/100;

此语句决不允许代码以大于两位小数的精度查看值。

为了使您的代码更加健壮,以下是您的代码的一个调整版本,其中包含一些 #define 语句来标识要查询的值以及所需小数点右侧的精度。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define check 3.14100
#define precision 1000

int main()
{
    int n=2;
    double sum,pi=4.000000,den;

    printf("Calculating the value of pi.\n");
    while(pi != check)
    {
        if(n%2==0)
        {
            den=(2*n)-1;
            sum=(4.0/den);
            pi=pi-sum;
        }
        else
        {
            den=(2*n)-1;
            sum=(4.0/den);
            pi=pi+sum;
        }
        pi=(round(pi*precision))/precision; /* Provide enough precision */
        printf("pi=%lf\n",pi);
        if(pi == check)
        {
            break;
        }
        n=n+1;
    }
    printf("The number of terms to get pi= %f is %d.\n", check, n-2);

    return 0;
}

主要内容是要使用的精度乘数/除数。

当使用值“3.14100”进行测试时,以下是终端上的最后几行 output。

pi=3.142000
pi=3.137000
pi=3.141000
The number of terms to get pi= 3.141000 is 443.

我使用固定的 #define 语句,但您可以对测试值执行一些位置检查,以提出一种更灵活的方法来确定所需的精度值。

试试看它是否符合您项目的精神。

与其限制为pi.= 3.14xxx ,不如对值使用公差。

fabs(pi - pi_Appoximate) >= 0.5 / limit

只需对 OP 的代码进行一些更改,就可以迭代而不是复制代码,增加 10 的幂。

int main(void) {
  printf("Calculating the value of pi.\n");
  char *pi_string = "3.1415926535897932384626433832795";
  for (unsigned i = 4; i<17; i++) {
    char buf[i + 1];
    buf[0] = '\0';
    double pi_Appoximate = atof(strncat(buf, pi_string, i));
    double limit = pow(10, i - 1);
    unsigned n = 2;
    double sum;
    double pi = 4;
    printf("i:%2u limit:%e ~pi:%.*g", i, limit, i, pi_Appoximate);
    fflush(stdout);
    while (fabs(pi - pi_Appoximate) >= 0.5 / limit) {
      if (n % 2 == 0) {
        sum = (4.0 / ((2 * n) - 1));
        pi = pi - sum;
      } else {
        sum = (4.0 / ((2 * n) - 1));
        pi = pi + sum;
      }
      pi = (round(pi * limit)) / limit;
      n = n + 1;
    }
    printf(" pi:%.*g n:%u\n", i, pi, n);
  }
  puts(pi_string);
}

Output

Calculating the value of pi.
i: 4 limit:1.000000e+03 ~pi:3.14 pi:3.14 n:802
i: 5 limit:1.000000e+04 ~pi:3.141 pi:3.141 n:1145
i: 6 limit:1.000000e+05 ~pi:3.1415 pi:3.1415 n:36366
i: 7 limit:1.000000e+06 ~pi:3.14159 pi:3.14159 n:72729
i: 8 limit:1.000000e+07 ~pi:3.141592 pi:3.141592 n:1379312
i: 9 limit:1.000000e+08 ~pi:3.1415926 pi:3.1415926 n:2649009
i:10 limit:1.000000e+09 ~pi:3.14159265 pi:3.14159265 n:7476638
i:11 limit:1.000000e+10 ~pi:3.141592653 pi:3.141592653 n:40363271
i:12 limit:1.000000e+11 ~pi:3.1415926535 pi:3.1415926535 n:58402689
i:13 limit:1.000000e+12 ~pi:3.14159265358 pi:3.14159265358 n:62874301
i:14 limit:1.000000e+13 ~pi:3.141592653589 pi:3.141592653589 n:68508285
i:15 limit:1.000000e+14 ~pi:3.1415926535897 pi:3.1415926535897 n:53634827
i:16 limit:1.000000e+15 ~pi:3.14159265358979 pi:3.14159265358979 n:59359529
3.1415926535897932384626433832795

由于double数学精度约为 15-17 位十进制数字,因此几乎不需要 go。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM