Cumulative standard deviation: Difference between revisions

Emacs Lisp: Improve solutions
(Emacs Lisp: Improve solutions)
Line 1,409:
=={{header|Emacs Lisp}}==
 
<lang lisp>(defun running-std (items)
This implementation uses a temporary buffer (the central data structure of emacs) to have simple local variables.
(sqrtlet (- (/ running-squared-sum 0)
(setq running-len (1+ (running-len) 0)
(make-local-variable ' (running-squared-sum 0)
(newlineresult 0))
(dolist (item items)
(setq running-sum (+ running-sum xitem))
(setq running-len) (/ (*1+ running-sum running-sumlen))
(setq running-squared-sum (+ running-squared-sum (* xitem xitem)))
(setq result (sqrt (- (/ running-squared-sum (float running-len))
(/ (* running-lensum running-len sum)))))</lang>
(float (* running-len running-len))))))
(message "%f" result))
result))
 
<lang lisp>(defun running-std '(x2 4 4 4 5 5 7 9))</lang>
; ensure that we have a float to avoid potential integer math errors.
(setq x (float x))
; define variables to use
(defvar running-sum 0 "the running sum of all known values")
(defvar running-len 0 "the running number of all known values")
(defvar running-squared-sum 0 "the running squared sum of all known values")
; and make them local to this buffer
(make-local-variable 'running-sum)
(make-local-variable 'running-len)
(make-local-variable 'running-squared-sum)
; now process the new value
(setq running-sum (+ running-sum x))
(setq running-len (1+ running-len))
(setq running-squared-sum (+ running-squared-sum (* x x)))
; and calculate the new standard deviation
(sqrt (- (/ running-squared-sum
running-len) (/ (* running-sum running-sum)
(* running-len running-len )))))</lang>
 
{{out}}
<lang lisp>(with-temp-buffer
(loop for i in '(2 4 4 4 5 5 7 9) do
(insert (number-to-string (running-std i)))
(newline))
(message (buffer-substring (point-min) (1- (point-max)))))
 
" 0.0000000
1.0000000
0.942809
0.9428090415820636
0.866025
0.8660254037844386
0.979796
0.9797958971132716
1.0000000
1.399708
1.399708424447531
2.000000
2.0"</lang>
2.0
 
{{libheader|Calc}}
Emacs Lisp with built-in Emacs Calc
 
<lang emacs-lisp>(let ((x '(2 4 4 4 5 5 7 9)))
(string-to-number (calc-eval (format "sqrt(vpvar(%s$1))" nil (append '(vec) x))))</lang>
(setq x '[2 4 4 4 5 5 7 9])
(string-to-number (calc-eval (format "sqrt(vpvar(%s))" x)))</lang>
 
{{libheader|generator.el}}
Emacs Lisp with generator library (introduced in Emacs 25.1)
 
<lang emacs-lisp>;; lexical-binding: t
(require 'generator)
 
(setq lexical-binding t)
(iter-defun std-dev-gen (lst)
(let ((sum 0)
(avg 0)
(tmp '())
(std 0))
(dolist (i lst)
(setq i (float i))
Line 1,469 ⟶ 1,460:
(setq std 0)
(dolist (j tmp)
(setq std (+ std (expt (- j avg) 2))))
(setq std (/ std (length tmp)))
(setq std (sqrt std))
Line 1,475 ⟶ 1,466:
 
(let* ((test-data '(2 4 4 4 5 5 7 9))
(generator (std-dev-gen test-data)))
(dolist (i test-data)
(princ (formatmessage "with %d : %f" i (iter-next generator))))</lang>
(princ (format "%f\n" (iter-next generator))))) </lang>
 
=={{header|Erlang}}==
Anonymous user