code 32020;
real procedure SUMPOSSERIES(AI, I, MAXADDUP, MAXZERO,MAXRECURS,
MACHEXP, TIM);
value MAXADDUP, MAXZERO, MAXRECURS, MACHEXP, TIM;
real AI, I, MAXZERO; integer MAXADDUP, MAXRECURS, MACHEXP, TIM;
begin integer RECURS, VL, VL2, VL4;
real procedure SUMUP(AI, I); real AI, I;
begin integer J; real SUM, NEXTTERM;
I:= MAXADDUP + 1; J:= 1;
CHECK ADD: if AI <= MAXZERO then
begin if J < TIM then
begin J:= J + 1; I:= I + 1; "GO TO" CHECK ADD end
end else
if RECURS ^= MAXRECURS then "GO TO" TRANSFORMSERIES;
SUM:= 0; I:= 0; J:= 0;
ADD LOOP: I:= I + 1; NEXTTERM:= AI;
J:= if NEXTTERM <= MAXZERO then J + 1 else 0;
SUM:= SUM + NEXTTERM;
if J < TIM then "GO TO" ADD LOOP;
SUMUP:= SUM; "GO TO" GOTSUM;
TRANSFORMSERIES:
begin boolean JODD; integer J2; array V[1:VL];
real procedure BJK(J, K); value J, K; real K;
integer J;
begin real COEFF;
if K > MACHEXP then BJK:= 0 else
begin COEFF:= 2 ** (K - 1); I:= J * COEFF;
BJK:= COEFF * AI
end
end BJK
real procedure VJ(J); value J; integer J;
begin real TEMP, K;
if JODD then
begin JODD:= false; RECURS:= RECURS + 1;
TEMP:= VJ:= SUMUP(BJK(J, K), K);
RECURS:= RECURS - 1;
if J <= VL then V[J]:= TEMP else
if J <= VL2 then V[J - VL]:= TEMP
end else
begin JODD:= true; if J > VL4 then
begin RECURS:= RECURS + 1;
VJ:= - SUMUP(BJK(J, K), K); RECURS:= RECURS - 1
end else
begin J2:= J2 + 1; I:= J2;
if J > VL2 then VJ:= - (V[J2 - VL] - AI) / 2
else
begin TEMP:= V[if J <= VL then J else
J - VL]:= (V[J2] - AI) / 2; VJ:= - TEMP
end
end
end
end VJ;
J2:= 0;
JODD:= true; SUMUP:= EULER(VJ(J + 1), J, MAXZERO, TIM)
end TRANSFORMSERIES;
GOTSUM:
end SUMUP;
RECURS:= 0; VL:= 1000; VL2:= 2 * VL; VL4:= 2 * VL2;
SUMPOSSERIES:= SUMUP(AI, I)
end SUMPOSSERIES;
eop