[ [原始]圆周率PI的计算(准确地说是几十万位) ) ) ) ) ) ) )。
//环境: VC6.0,控制台应用程序
//原理:=21/3*(22/5* ) 23/7* ) 2 .
//特点:在线汇编高速化,计算范围扩大
//限制:原则上位数ws没有限制,但本
//因为算法的时间与ws的平方成比例,所以将位数设定为
(最好控制在二三十万以内。 本人使用过
) )2.6GHz,20万位,需要10分钟左右
#包含
#包含
#包含
#包含
long a=100000L;
void main () )
{ FILE *fp;
长t1、t2;
char filename[40];
unsigned long c,d,e,I,j,ws;
unsigned long *f,*bb;
printf ('位数=? );
scanf('%LD ',ws );
if(ws1 )返回;
c=(ws4 )/05*17;
b=f=(long* ) malloc ) 04*c );
if(f==null ) abort );
printf(pi为: ); //提示输入数据文件名
scanf('%s ',filename ); 如果输入//nul,则不保存磁盘
FP=fopen(filename,' w ' );
if(FP==null ) abort );
t1=time (空);
for(I=0; I
*bb=a/5; *bb=a/5; //这里还不错
for(e=0; C; c-=17,bb-=17,e=d%a )
{静态长组;
d=0; i=c;
j=c c-1;
_asm mov eDI,bb
loopi:
_asm mov eax,[eDI]
_asm mul Dword ptr a
_asm mov ecx,edx
_asm mov ebx,eax
_asm mov eax,d
_asm mul dword ptr i
_asm add eax,ebx
_asm adc edx,ecx
_asm div dword ptr j
_asm mov d,eax
_asm mov [eDI],edx
_asm sub eDI,04
_asm dec dword ptr j
_asm dec dword ptr j
_asm dec dword ptr i
_asm jnz loopi
e =d/a; //这是为了避免重复计算
if(e=100000 )//这是一个糟糕的情况
abort (; //那个最好不要发生
if(group0==0)//万位数附近
printf(Lu(t ),e ); 显示//5位
fprintf(FP,' Lu ',e ); //写入光盘
() ) ) ) )。
T2=time (空);
printf('%LD秒(n ),t2-t1 );
free(f;
flose(FP );
() ) ) ) )。
[此帖子已在2007-4-9 17:41:55中编辑]