Public feed
#379659
program partialSums;
const twothirds=2/3;
var sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8,sum9:double;
n: longint;
function power(base,exponent:double):double;inline;
const nan=0/0;
begin
if exponent=0.0 then
if base<>0.0 then
power:=1.0
else
power:=nan
else if (base=0.0) and (exponent>0.0) then
power:=0.0
else if base>0.0 then
power:=exp(exponent*ln(base))
else
power:=nan;
end;
procedure calculate;
var sink,cosk,a,k_inv,k_sqr,k_cube:double;
k:longint;
begin
sum1:=0;
sum2:=0;
sum3:=0;
sum4:=0;
sum5:=0;
sum6:=0;
sum7:=0;
sum8:=0;
sum9:=0;
a := -1.0;
for k := 1 to n do
begin
k_inv:=1/k;
k_sqr:=k_inv*k_inv; { might as well only calc sqr once and base cube off of sqare, yes? }
k_cube:=k_sqr*k_inv;
sink := sin(k);
cosk := cos(k);
a := -a;
sum1 := sum1 + power(twothirds,k-1);
sum2 := sum2 + 1.0 /sqrt(k);
sum3 := sum3 + k_inv/(k+1);
sum4 := sum4 + k_cube/(sink*sink); { why recalc when its already done once? }
sum5 := sum5 + k_cube/(cosk*cosk);
sum6 := sum6 + k_inv;
sum7 := sum7 + k_sqr;
sum8 := sum8 + a*k_inv;
sum9 := sum9 + a/(k + k - 1.0 );
end;
end;
begin
if paramCount() = 1
then Val (ParamStr (1),n)
else n := 2500000;
calculate;
writeln(sum1:10:9, #9, '(2/3)^k');
writeln(sum2:10:9, #9,'k^-0.5');
writeln(sum3:10:9, #9,'1/k(k+1)');
writeln(sum4:10:9, #9,'Flint Hills');
writeln(sum5:10:9, #9,'Cookson Hills');
writeln(sum6:10:9, #9,'Harmonic');
writeln(sum7:10:9, #9,'Riemann Zeta');
writeln(sum8:10:9, #9,'Alternating Harmonic');
writeln(sum9:10:9, #9,'Gregory');
end.