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.