正文

整理我以前的PASCAL源程序-高精度计算(4)计算Ln(3)2010-08-20 00:41:00

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

分享到:

公式就不多说了,注释写得很清楚。 program Ln_3; { This program is computing Ln(3)   Ln(1-z) = -(z+z^2/2+z^3/3+...)   -Ln(1-z) = z+z^2/2+z^3/3+...   Let z =2/3   Ln(3) = -Ln(1-2/3) = (2/3) + (2/3)^2/2 + (2/3)^3/3 + ... } label ext; const      dn=307; var     i,k:longint;     sum,a:array[1..dn] of integer;     ip:integer; procedure outp; var   i:integer; procedure writep(num:integer); begin     write(num div 1000);     write(num div 100 mod 10);     write(num div 10 mod 10);     write(num mod 10,' '); end; begin    writeln('Ln(3)=');    writeln(sum[1],'.');    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     for i:=1 to dn do a[i]:=0;     a[1]:=1;     sum:=a;     sum[1]:=0;     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(k*3);         m_mul(2);         m_add;         m_mul(k);         k:=k+1;     until false; ext:     outp; end.

阅读(1156) | 评论(0)


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

评论

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