#!/usr/local/bin/perl # $Id: moments.perl,v 1.5 2001/01/05 22:36:44 doug Exp $ # http://www.bagley.org/~doug/shootout/ use strict; my @nums = <STDIN>; my $sum = 0; foreach (@nums) { $sum += $_ } my $n = scalar(@nums); my $mean = $sum/$n; my $average_deviation = 0; my $standard_deviation = 0; my $variance = 0; my $skew = 0; my $kurtosis = 0; foreach (@nums) { my $deviation = $_ - $mean; $average_deviation += abs($deviation); $variance += $deviation**2; $skew += $deviation**3; $kurtosis += $deviation**4; } $average_deviation /= $n; $variance /= ($n - 1); $standard_deviation = sqrt($variance); if ($variance) { $skew /= ($n * $variance * $standard_deviation); $kurtosis = $kurtosis/($n * $variance * $variance) - 3.0; } @nums = sort { $a <=> $b } @nums; my $mid = int($n/2); my $median = ($n % 2) ? $nums[$mid] : ($nums[$mid] + $nums[$mid-1])/2; printf("n: %d\n", $n); printf("median: %f\n", $median); printf("mean: %f\n", $mean); printf("average_deviation: %f\n", $average_deviation); printf("standard_deviation: %f\n", $standard_deviation); printf("variance: %f\n", $variance); printf("skew: %f\n", $skew); printf("kurtosis: %f\n", $kurtosis);