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