code 41509;
real procedure NCCHISQ(X, DF, DELTA);
value X, DF, DELTA; real X, DF, DELTA;
begin real FACTOR1, FACTOR2, PROB, SUM, TERM;
integer M;
if DF < 1 ∨ DF > ENTIER(DF) then
STATAL3ERROR(“NCCHISQ”, 2, DF);
if DELTA < 0 then
STATAL3ERROR(“NCCHISQ”, 3, DELTA);
if X ≤ 0 then NCCHISQ:= 0 else
if DELTA = 0 then NCCHISQ:= CHISQ(X, DF) else
begin PROB:= CHISQ(X, DF); X:= X / 2; DF:= DF / 2;
DELTA:= DELTA / 2; FACTOR1:= EXP(-DELTA);
FACTOR2:= EXP(DF × LN(X) - X - LOGGAMMA(DF + 1));
TERM:= SUM:= PROB × FACTOR1; M:= 0;
for M:= M + 1
while ¬( TERM < 10-9 ∧ M > DELTA ) do
begin FACTOR1:= FACTOR1 × DELTA / M;
PROB:= PROB - FACTOR2;
FACTOR2:= FACTOR2 × X / (DF + M);
TERM:= PROB × FACTOR1; SUM:= SUM + TERM
end;
NCCHISQ:= SUM
end;
end NCCHISQ;
eop