-- -*- mode: eiffel -*- -- $Id: moments.se,v 1.2 2001/05/23 18:29:33 doug Exp $ -- http://www.bagley.org/~doug/shootout/ -- from Steve Thompson -- <LOC-OFF> indexing description: "This class performs the statistical moments test" author : Steve Thompson email : "Steve_Thompson@prodigy.net" date : February 18, 2001 compile: "compile -clean -boost -no_split -O3 main.e -o main" run : "main < Input" -- <LOC-ON> class MOMENTS creation make feature -- Creation make is local index: INTEGER number: INTEGER mid: INTEGER deviation: DOUBLE sorter: COLLECTION_SORTER[INTEGER] do !!values.make(0,499) read_values mean := sum / values.count from index := values.lower until index > values.upper loop number := values @ index deviation := number - mean average_deviation := average_deviation + deviation.abs variance := variance + deviation ^ 2 skew := skew + deviation ^ 3 kurtosis := kurtosis + deviation ^ 4 index := index + 1 end average_deviation := average_deviation / values.count variance := variance / (values.count - 1) standard_deviation := variance.sqrt --math.sqrt(variance) if variance > 0.0 then skew := skew / (values.count * variance * standard_deviation) kurtosis := kurtosis / (values.count * variance * variance) - 3.0 end sorter.sort(values) mid := values.count // 2 if (values.count \\ 2) = 0 then median := (values.item(mid) + values.item(mid - 1)) / 2 else median := values @ mid end print ("n: " + values.count.to_string + "%N") print ("median: " + median.to_string + "%N") print ("mean: " + mean.to_string + "%N") print ("average_deviation: " + average_deviation.to_string + "%N") print ("standard_deviation: " + standard_deviation.to_string + "%N") print ("variance: " + variance.to_string + "%N") print ("skew: " + skew.to_string + "%N") print ("kurtosis: " + kurtosis.to_string + "%N") end -- make feature -- Queries sum: INTEGER mean, median, average_deviation, standard_deviation, variance, skew, kurtosis: DOUBLE values: ARRAY[INTEGER] -- Values read from stdin read_values is local value: INTEGER index: INTEGER do from index := values.lower std_input.read_line until std_input.end_of_input loop value := std_input.last_string.to_integer values.force(value, index) std_input.read_line sum := sum + value index := index + 1 end end -- get_stdin end