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