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