BEGIN REAL PROCEDURE FACTORIAL(N); INTEGER N; BEGIN REAL RESULT; INTEGER I; RESULT := 1.0; FOR I := 2 STEP 1 UNTIL N DO RESULT := RESULT * I; FACTORIAL := RESULT; END FACTORIAL; REAL PROCEDURE ANALYTICAL (N); INTEGER N; BEGIN REAL SUM, RN; INTEGER I; RN := N; FOR I := 1 STEP 1 UNTIL N DO BEGIN SUM := SUM + FACTORIAL(N) / FACTORIAL(N - I) / RN ** I; END; ANALYTICAL := SUM; END ANALYTICAL; REAL PROCEDURE EXPERIMENTAL(N); INTEGER N; BEGIN INTEGER NUM; INTEGER COUNT; INTEGER RUN; FOR RUN := 1 STEP 1 UNTIL TESTS DO BEGIN BOOLEAN ARRAY BITS(1:N); INTEGER I; FOR I := 1 STEP 1 UNTIL N DO BEGIN NUM := RANDINT(1,N,SEED); IF BITS(NUM) THEN GOTO L; BITS(NUM) := TRUE; COUNT := COUNT + 1; END FOR I; L: END FOR RUN; EXPERIMENTAL := COUNT / TESTS; END EXPERIMENTAL; INTEGER SEED, TESTS; SEED := ININT; TESTS := 1000000; BEGIN REAL A, E, ERR; INTEGER I; OUTTEXT(" N AVG CALC %DIFF"); OUTIMAGE; FOR I := 1 STEP 1 UNTIL 20 DO BEGIN A := ANALYTICAL(I); E := EXPERIMENTAL(I); ERR := (ABS(E-A)/A)*100.0; OUTINT(I, 2); OUTFIX(E, 4, 7); OUTFIX(A, 4, 10); OUTFIX(ERR, 4, 10); OUTIMAGE; END FOR I; END; END