from
Calculate pi decimals
by Jonas Lundgren
Calculate pi decimals with Machin's formula
pi = 16*acot(5) - 4*acot(239)
|
| machin(m)
|
function s = machin(m)
%MACHIN Calculate decimals of pi with Machin's formula
% MACHIN(M) gives a string with pi truncated to M decimals
% using Machin's formula: pi = 16*acot(5) - 4*acot(239)
%
% This is a faster but less readable version of MACHIN0.
% Author: Jonas Lundgren <splinefit@gmail.com> 2011
if nargin < 1, m = 50; end
base = 1e15;
n = ceil(m/15) + 1;
% Machin's formula
x = xacot(5,16,n,base) - xacot(239,4,n,base);
% Canonical form
carry = 0;
for k = n+1:-1:1
xk = x(k) + carry;
carry = floor(xk/base);
x(k) = xk - carry*base;
end
% Write string
s = sprintf('%15.0f',x(2:n));
s(isspace(s)) = '0';
s = ['3.', s(1:m)];
%--------------------------------------------------------------------------
function y = xacot(a,c,n,base)
% Calculate C*ACOT(A) to N digits in base BASE
b = a*a;
t = floor(base/b);
u = base - b*t;
m = floor(n*log(base)/log(b));
% y = 0
y = zeros(n+1,1);
% y = c/(2*k+1) - y/b
for k = m:-1:0
nn = ceil(n-n*k/m+1);
bb = 2*k+1;
tt = floor(base/bb);
uu = base - bb*tt;
vv = c;
v = y(1);
qq = floor(vv/bb);
q = floor(v/b);
y(1) = qq - q;
for j = 2:nn
rr = vv - bb*qq;
r = v - b*q;
vv = rr*uu;
v = y(j) + r*u;
qq = floor(vv/bb);
q = floor(v/b);
y(j) = qq + rr*tt - q - r*t;
end
end
% y = y/a
r = 0;
t = floor(base/a);
u = base - a*t;
for k = 1:n+1
v = y(k) + r*u;
q = floor(v/a);
y(k) = q + r*t;
r = v - a*q;
end
|
|
Contact us at files@mathworks.com