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