#!/usr/bin/newlisp

;; moments - benchmark


;; read file filter empty lines

(define (main)
  (while (read-line) (push (float (current-line)) nums))
  (set 'nums (reverse (filter float? nums)))
  (set 'n (length nums))


  (set 'sum (apply add nums))
  (set 'mean (div sum n))

  (set 'avg-dev 0 'std-dev 0 'var 0 'skew 0 'kurtosis 0)

  (set 'dev (map sub nums (dup mean n)))
  (set 'avg-dev (div (apply add (map abs dev)) n))
  (set 'var (div (apply add (map mul dev dev)) (- n 1)))
  (set 'skew (apply add (map mul dev dev dev)))
  (set 'kurtosis (apply add (map  mul dev dev dev dev)))

  (set 'std-dev (sqrt var))

  (if (> var 0.0)
    (begin
	(set 'skew (div skew (mul n var std-dev)))
	(set 'kurtosis (sub (div kurtosis (mul n var var)) 3.0))))

  (sort nums)
  (set 'mid (/ n 2))

  (if (= 0 (% n 2))
	(set 'median (div (add (nums mid) (nums (- mid 1))) 2))
	(set 'median (nums mid)))

  (println (format "n:                  %d" n))
  (println (format "median:             %f" median))
  (println (format "mean:               %f" mean))
  (println (format "average_deviation:  %f" avg-dev))
  (println (format "standard_deviation: %f" std-dev))
  (println (format "variance:           %f" var))
  (println (format "skew:               %f" skew))
  (println (format "kurtosis:           %f" kurtosis))
)

(main)

;; eof


syntax highlighting with newLISP and syntax.cgi