(* * $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