请问如何计算圆周率?

时间:2021-11-15 18:35:02
请问如何设计算法计算小数点后100位的圆周率?

12 个解决方案

#1


too many

#2


have u learn gailu

#3


jishu

#4


attention

#5





              参考<高数>里面的级数(还是展开式?自己想想).我就知道这么多.




#6


用级数的知识。

#7


用变步长梯形积分的方法求出一个1/4圆的面积,就可求出圆周率的值。

#8


关键是要解决位数问题。
理论上级数是可以计算到无穷多位,可是想想C里面有那种类型的精度可以达到100位。

刚上大学的时候见过一个basic程序,它可以无限计算下去(只要你有时间)。具体用什么方法我当时没看懂,好像是递推,把已经计算过的位存起来,这样可以保证所有的运算都在精度范围内完成。
回答得太臭,算是个大家提供一点思路吧。

#9


可以用概率论的投点法计算,但关键是要解决精度问题。这个精度如何解决俺不知道。

#10


精确到小数点后100位:

#include <stdio.h>
#define PI_DIGITS 100
#define PI_BUFFLEN (PI_DIGITS*14/4)
unsigned long b,c,d,e,f[PI_BUFFLEN+1],g, n; 

main()

for(b=0;b!=PI_BUFFLEN;b++) f[b]=2000; 
for (e=0,c=PI_BUFFLEN;c;c-=14)
{
d=0;
for(b=c;b;b--)
{
d += f[b]*10000;
g = b*2-1;
f[b] = d%g;
d /= g;
if (b>1) d *= b-1;
if (d>4000000000l)
printf("|%d\n",n);
}
printf("%.4d",e+d/10000);
n+=4;
e=d%10000;
}

#11


高数书上有这方面的知识,先算一个Tn,再根据Tn算一个T2n,T2n是可以由Tn算出来的,这样
在程序中可以加上一个判断
if(|Tn-T2n|<a)
{
   //...
}
其中a是你要求的精度,选个无限接近0的数就行了,具体Tn,T2n是什么,你自己找书吧,我的书早不就不知道哪去了(丢了^-^).

#12



精确到小数点后100000位,想算多少位就多少位!!! 






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

int main(void) 

static double a[2002] = {0},b[2002]={0},c[2002]={0}; 
static double r = 100000; 
static double sa,sb,sc,d,g; 
long w = 2001,m=0,q=-1,k=0,i=1,n,j; 

FILE *fp; 

char pai[] = "pai = 3."; 
b[1] = 8000000,c[1]=95600000; 
fp = fopen("D:\\pai.txt","wb"); 
fprintf(fp,"%s",pai); 

t1: 
q=-q;sa=sb=sc=0; 

t2: 
if (m>w) 

goto t3; 


if (c[m] == 0) 

m++; 
goto t2; 


for (j=m;j<=w;j++) 

sc = c[j] + sc*r; 
modf(sc/57121,&c[j]); 
sc=sc-c[j]*57121; 


t3: 
if (k>w) 

goto t4; 


if (b[k] == 0) 

k++; 
goto t3; 


for (j=k;j<=w;j++) 

sa=b[j]+sa*r; 
b[j]=(long)(sa/25); 
sa=sa-b[j]*25; 
d=b[j]-c[j]+sb*r; 
sb=(long)(d/i); 
a[j]=a[j]+q*sb; 
sb=d-sb*i; 


i+=2; 
goto t1; 

t4: 
n=0; 
for (j=w;j>=1;j--) 

g=a[j]+n; 
if (g>=0) 

n=(long)(g/r); 
a[j]=g-n*r; 

else 

n=(long)((g-99999)/r); 
a[j]=g-r*n; 



printf("\n\n pai=%ld.",n); 

for (j=1;j<=w-1;j++) 

printf("%05ld",(long)a[j]); 
n=(long)a[j]; 
fprintf(fp,"%ld",n); 
if (j % 240 == 0) 

getch(); 



return 0; 

#1


too many

#2


have u learn gailu

#3


jishu

#4


attention

#5





              参考<高数>里面的级数(还是展开式?自己想想).我就知道这么多.




#6


用级数的知识。

#7


用变步长梯形积分的方法求出一个1/4圆的面积,就可求出圆周率的值。

#8


关键是要解决位数问题。
理论上级数是可以计算到无穷多位,可是想想C里面有那种类型的精度可以达到100位。

刚上大学的时候见过一个basic程序,它可以无限计算下去(只要你有时间)。具体用什么方法我当时没看懂,好像是递推,把已经计算过的位存起来,这样可以保证所有的运算都在精度范围内完成。
回答得太臭,算是个大家提供一点思路吧。

#9


可以用概率论的投点法计算,但关键是要解决精度问题。这个精度如何解决俺不知道。

#10


精确到小数点后100位:

#include <stdio.h>
#define PI_DIGITS 100
#define PI_BUFFLEN (PI_DIGITS*14/4)
unsigned long b,c,d,e,f[PI_BUFFLEN+1],g, n; 

main()

for(b=0;b!=PI_BUFFLEN;b++) f[b]=2000; 
for (e=0,c=PI_BUFFLEN;c;c-=14)
{
d=0;
for(b=c;b;b--)
{
d += f[b]*10000;
g = b*2-1;
f[b] = d%g;
d /= g;
if (b>1) d *= b-1;
if (d>4000000000l)
printf("|%d\n",n);
}
printf("%.4d",e+d/10000);
n+=4;
e=d%10000;
}

#11


高数书上有这方面的知识,先算一个Tn,再根据Tn算一个T2n,T2n是可以由Tn算出来的,这样
在程序中可以加上一个判断
if(|Tn-T2n|<a)
{
   //...
}
其中a是你要求的精度,选个无限接近0的数就行了,具体Tn,T2n是什么,你自己找书吧,我的书早不就不知道哪去了(丢了^-^).

#12



精确到小数点后100000位,想算多少位就多少位!!! 






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

int main(void) 

static double a[2002] = {0},b[2002]={0},c[2002]={0}; 
static double r = 100000; 
static double sa,sb,sc,d,g; 
long w = 2001,m=0,q=-1,k=0,i=1,n,j; 

FILE *fp; 

char pai[] = "pai = 3."; 
b[1] = 8000000,c[1]=95600000; 
fp = fopen("D:\\pai.txt","wb"); 
fprintf(fp,"%s",pai); 

t1: 
q=-q;sa=sb=sc=0; 

t2: 
if (m>w) 

goto t3; 


if (c[m] == 0) 

m++; 
goto t2; 


for (j=m;j<=w;j++) 

sc = c[j] + sc*r; 
modf(sc/57121,&c[j]); 
sc=sc-c[j]*57121; 


t3: 
if (k>w) 

goto t4; 


if (b[k] == 0) 

k++; 
goto t3; 


for (j=k;j<=w;j++) 

sa=b[j]+sa*r; 
b[j]=(long)(sa/25); 
sa=sa-b[j]*25; 
d=b[j]-c[j]+sb*r; 
sb=(long)(d/i); 
a[j]=a[j]+q*sb; 
sb=d-sb*i; 


i+=2; 
goto t1; 

t4: 
n=0; 
for (j=w;j>=1;j--) 

g=a[j]+n; 
if (g>=0) 

n=(long)(g/r); 
a[j]=g-n*r; 

else 

n=(long)((g-99999)/r); 
a[j]=g-r*n; 



printf("\n\n pai=%ld.",n); 

for (j=1;j<=w-1;j++) 

printf("%05ld",(long)a[j]); 
n=(long)a[j]; 
fprintf(fp,"%ld",n); 
if (j % 240 == 0) 

getch(); 



return 0;