65 lines
1.6 KiB
Plaintext
65 lines
1.6 KiB
Plaintext
$ 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;
|