精确计算2的平方根

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

精确计算2的平方根(小数点后10000位)

计算2的平方根,用到下面的公式:

1/sqrt(1-x)=1+ 1/2 * x + (1*3)/(2*4) * x^2+ (1*3*5)/(2*4*6) * x^3 + ………

理论上代入x=1/2 时就得到了 2的平方根。但是收敛会太慢。为了使得收敛的速度更快,这里,程序选择了 x=1/57122

可以代入左边的式子看看它和sqrt(2)有什么关系,57122是怎么找出来的?呵呵!当然不是我想出来的,而是用编程的方法找到的。类似的,如让 x= 1/50 , x= 1/1682 ,都远比 x=1/2

收敛速度要快。

计算出来的最后,我们只要乘回一个系数就达到目的了。

program sqrt_2;

label ext;

const

dn=2504;

var

i,k:longint;

sum,a:array[1..dn] of integer;

ip:integer;

procedure outp;

var

i,m:integer;

procedure testm;

begin

if m mod 10=0 then write(' ');

if (m mod 50=0) and (m mod 1000<>0) then

if m mod 1000<>0 then exit;

writeln(':',m:8,' Press Enter..');

readln;

end;

procedure writep(num:integer);

begin

write(num div 1000); m:=m+1; testm;

write(num div 100 mod 10); m:=m+1; testm; write(num div 10 mod 10); m:=m+1; testm; write(num mod 10); m:=m+1; testm;

end;

begin

writeln('sqrt(2)=');

writeln(sum[1],'.');

m:=0;

for i:=2 to dn do

writep(sum[i]) ;

writeln;

writeln('Programmed by j.t.chang');

end;

procedure m_div(k:longint);

var

i:integer;

r1,c:longint;

begin

c:=0;

begin

r1:=c*10000+a[i]; a[i]:=r1 div k;

c:=r1 mod k;

end;

end;

procedure sm_div(k:longint); var

i:integer;

r1,c:longint;

begin

c:=0;

for i:=1 to dn do

begin

r1:=c*10000+sum[i]; sum[i]:=r1 div k; c:=r1 mod k;

end;

end;

procedure m_mul(k:longint); var

i:integer;

r1,c:longint;

begin

c:=0;

for i:=dn downto ip do

begin

r1:=k*a[i]+c;

end;

if ip=1 then

begin

a[1]:=c;

exit;

end;

i:=ip-1;

while c>0 do

begin

if i=1 then

begin

a[1]:=c;

exit

end;

a[i]:=c mod 10000; c:=c div 10000;

i:=i-1;

end;

end;

procedure sm_mul(k:longint); var

i:integer;

r1,c:longint;

begin

c:=0;

for i:=dn downto 2 do

begin

r1:=k*sum[i]+c;

end;

r1:=1;

r1:=r1*k*sum[1]+c;

sum[1]:=r1 ;

end;

procedure m_add;

var

i:integer;

c:longint;

begin

c:=0;

for i:=dn downto 1 do

begin

sum[i]:=sum[i]+a[i]+c;

if sum[i]>=10000 then

begin

c:=sum[i] div 10000;

sum[i]:=sum[i] mod 10000; end

else c:=0;

end;

end;

begin

writeln('Please wait...');

for i:=1 to dn do a[i]:=0;

相关文档
最新文档