正文

整理我以前的PASCAL源程序-高精度计算(3)计算Sqrt(2)和黄金分割2010-08-19 23:18:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/jtchang/51682.html

分享到:

1、计算sqrt(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/57122时,代入左边算算得到什么数。Sqrt(2)前多一个系数没关系,最后做一步简单的系数乘除就行了。   选择x=1/57122,是为了让级数收敛更快些。当然,选1/50、1/1682 也是可以的,慢一点而已。 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               writeln(':',m:8);      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;    for i:=ip to dn do       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;          a[i]:=r1 mod 10000;          c:=r1 div 10000;       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;          sum[i]:=r1 mod 10000;          c:=r1 div 10000;       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;     a[1]:=1;     sum:=a;     k:=1;     ip:=1;     repeat        i:=ip;        while (a[i]=0) do          begin             i:=i+1;             if i>dn then goto ext;          end;         ip:=i;         m_div(2*k);         m_mul(2*k-1);         m_div(57122);         m_add;         k:=k+1;     until false; ext:     sm_div(169);     sm_mul(239);     outp; end. 2、计算黄金分割   黄金分割= ( sqrt(5)-1 )/2   其实把sqrt(5)算出来就解决了。只要修改以上主程序最后几句:   m_div(57122); 这句修改为两句:m_div(39605); m_mul(4);   sm_div(169); 修改为:sm_div(89);   sm_mul(239); 这句修改为三句:sm_mul(199); sum[1]:=sum[1]-1; sm_div(2);   运行后,得到黄金分割的数值为0.6180339887……小数点后一万个数位。

阅读(1952) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册