code 41000;
real procedure BIN(X, N, P);
value X, N, P; real X, N, P;
begin integer IX;

      IX:= ENTIER(X);
      if N < 0 ∨ N > ENTIER(N) then
      BIN:= STATAL3 ERROR(“BIN”, 2, N) else
      if P < 0 ∨ P > 1 then
      BIN:= STATAL3 ERROR(“BIN”, 3, P) else
      if IX < 0 then BIN:= 0 else
      if IX ≥ N then BIN:= 1 else
      if P = 0 then BIN:= 1 else
      if P = 1 then BIN:= 0 else
      if N > 1000 then
      begin real B;
          B:= 1 - INCOMPLETE BETA(P, IX + 1, N - IX, 10-12);
          BIN:= if B < 0 then 0 else B;
      end   else
      begin real procedure TAIL;
          begin integer I; real PROB, CUM, LAST;
              PROB:= CUM:= BINPROB(IX, N, P);
              for I:= IX - 1, I - 1 while CUM > LAST do
              begin PROB:=
                   PROB × (1 - P) / P × (I + 1) / (N - I);
                   LAST:= CUM; CUM:= CUM + PROB
              end;
              TAIL:= CUM
          end;
          if X > ENTIER(N / 2) then
          begin IX:= N - IX - 1; P:= 1 - P;
              BIN:= 1 - TAIL
          end else BIN:= TAIL
     end;
end BIN;
eop