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