![](/img/trans.png)
[英]Print Value of pi. How many terms of this series do you have to use before you first get 3.14? 3.141? 3.1415? 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.