Public feed #379659

Partialssums edit

public text v1 · immutable
Raw Edit
·published 2007-03-03 12:12 UTC
rendered paste body
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.