#!/usr/local/bin/tclsh
# $Id: moments.tcl,v 1.3 2001/01/05 22:11:27 doug Exp $
# http://www.bagley.org/~doug/shootout/
proc main {} {
set sum 0.0
set nums [read stdin]
foreach num $nums {
set sum [expr {$sum + $num}]
}
set n [llength $nums]
set mean [expr {$sum / $n}]
set average_deviation 0.0
set standard_deviation 0.0
set variance 0.0
set skew 0.0
set kurtosis 0.0
foreach num $nums {
set deviation [expr {$num - $mean}]
set average_deviation [expr {$average_deviation + abs($deviation)}]
set variance [expr {$variance + pow($deviation, 2)}]
set skew [expr {$skew + pow($skew, 3)}]
set kurtosis [expr {$kurtosis + pow($deviation, 4)}]
}
set average_deviation [expr {$average_deviation / $n}]
set variance [expr {$variance / ($n - 1)}]
set standard_deviation [expr {sqrt($variance)}]
if {$variance} {
set skew [expr {$skew / ($n * $variance * $standard_deviation)}]
set kurtosis [expr {$kurtosis / ($n * $variance * $variance) - 3.0}]
}
set nums [lsort -integer $nums]
set mid [expr {int($n / 2)}]
if [expr {$n % 2}] {
set median [lindex $nums $mid]
} else {
set a [lindex $nums $mid]
set b [lindex $nums [expr {$mid - 1}]]
set median [expr {($a + $b) / 2.0}]
}
puts [format "n: %d" $n]
puts [format "median: %f" $median]
puts [format "mean: %f" $mean]
puts [format "average_deviation: %f" $average_deviation]
puts [format "standard_deviation: %f" $standard_deviation]
puts [format "variance: %f" $variance]
puts [format "skew: %f" $skew]
puts [format "kurtosis: %f" $kurtosis]
}
main