(*
* $Id: moments.ocaml,v 1.9 2001/05/20 16:43:13 doug Exp $
* http://www.bagley.org/~doug/shootout/
* with help from Markus Mottl
*)
let _ =
let n = ref 0
and num = ref 0.0
and sum = ref 0.0
and mean = ref 0.0
and average_deviation = ref 0.0
and standard_deviation = ref 0.0
and variance = ref 0.0
and skew = ref 0.0
and kurtosis = ref 0.0
and deviation = ref 0.0
and size = ref 4096 in
let nums_in = ref (Array.create !size 0.0) in
try
while true do
num := read_float ();
!nums_in.(!n) <- !num;
sum := !sum +. !num;
incr n;
if !n = !size then begin
nums_in := Array.append !nums_in (Array.create !size 0.0);
size := !size * 2
end
done
with End_of_file -> ();
let nums = Array.create !n 0.0 in
Array.blit !nums_in 0 nums 0 !n;
let n_float = float_of_int !n in
mean := !sum /. n_float;
for i = 0 to !n - 1 do
deviation := nums.(i) -. !mean;
average_deviation := !average_deviation +. abs_float !deviation;
let dev2 = !deviation *. !deviation in
variance := !variance +. dev2;
let dev3 = dev2 *. !deviation in
skew := !skew +. dev3;
let dev4 = dev3 *. !deviation in
kurtosis := !kurtosis +. dev4;
done;
average_deviation := !average_deviation /. n_float;
variance := !variance /. float_of_int (!n - 1);
standard_deviation := sqrt !variance;
if !variance > 0.0 then begin
skew := !skew /. n_float /. !variance /. !standard_deviation;
kurtosis := !kurtosis /. n_float /. !variance /. !variance -. 3.0;
end;
Array.stable_sort compare nums;
let mid = !n lsr 1 in
let median =
if !n mod 2 = 1 then nums.(mid)
else (nums.(mid) +. nums.(mid - 1)) /. 2.0 in
Printf.printf "n: %d\n" !n;
Printf.printf "median: %f\n" median;
Printf.printf "mean: %f\n" !mean;
Printf.printf "average_deviation: %f\n" !average_deviation;
Printf.printf "standard_deviation: %f\n" !standard_deviation;
Printf.printf "variance: %f\n" !variance;
Printf.printf "skew: %f\n" !skew;
Printf.printf "kurtosis: %f\n" !kurtosis