12 个解决方案
#1
too many
#2
have u learn gailu
#3
jishu
#4
attention
#5
参考<高数>里面的级数(还是展开式?自己想想).我就知道这么多.
#6
用级数的知识。
#7
用变步长梯形积分的方法求出一个1/4圆的面积,就可求出圆周率的值。
#8
关键是要解决位数问题。
理论上级数是可以计算到无穷多位,可是想想C里面有那种类型的精度可以达到100位。
刚上大学的时候见过一个basic程序,它可以无限计算下去(只要你有时间)。具体用什么方法我当时没看懂,好像是递推,把已经计算过的位存起来,这样可以保证所有的运算都在精度范围内完成。
回答得太臭,算是个大家提供一点思路吧。
理论上级数是可以计算到无穷多位,可是想想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;
}
}
#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是什么,你自己找书吧,我的书早不就不知道哪去了(丢了^-^).
在程序中可以加上一个判断
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程序,它可以无限计算下去(只要你有时间)。具体用什么方法我当时没看懂,好像是递推,把已经计算过的位存起来,这样可以保证所有的运算都在精度范围内完成。
回答得太臭,算是个大家提供一点思路吧。
理论上级数是可以计算到无穷多位,可是想想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;
}
}
#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是什么,你自己找书吧,我的书早不就不知道哪去了(丢了^-^).
在程序中可以加上一个判断
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;
}