$ include "seed7_05.s7i"; include "float.s7i"; const integer: TESTS is 1000000; const func float: factorial (in integer: number) is func result var float: factorial is 1.0; local var integer: i is 0; begin for i range 2 to number do factorial *:= flt(i); end for; end func; const func float: analytical (in integer: number) is func result var float: sum is 0.0; local var integer: i is 0; begin for i range 1 to number do sum +:= factorial(number) / factorial(number - i) / flt(number)**i; end for; end func; const func float: experimental (in integer: number) is func result var float: experimental is 0.0; local var integer: run is 0; var set of integer: seen is EMPTY_SET; var integer: current is 1; var integer: count is 0; begin for run range 1 to TESTS do current := 1; seen := EMPTY_SET; while current not in seen do incr(count); incl(seen, current); current := rand(1, number); end while; end for; experimental := flt(count) / flt(TESTS); end func; const proc: main is func local var integer: number is 0; var float: analytical is 0.0; var float: experimental is 0.0; var float: err is 0.0; begin writeln(" N avg calc %diff"); for number range 1 to 20 do analytical := analytical(number); experimental := experimental(number); err := abs(experimental - analytical) / analytical * 100.0; writeln(number lpad 2 <& experimental digits 4 lpad 7 <& analytical digits 4 lpad 7 <& err digits 3 lpad 7); end for; end func;