diff --git a/math/stddev.jule b/math/stddev.jule new file mode 100644 index 0000000..145bbd3 --- /dev/null +++ b/math/stddev.jule @@ -0,0 +1,18 @@ +use "std/math" + +fn Stddev(slice: []int): f64 { + let l = len(slice) + if l == 0 { + return 0 + } + + let m = Mean(slice) + + let mut sqSum: f64 = 0 + for _, n in slice { + let d = f64(n) - m + sqSum += d * d + } + + return math::Sqrt(sqSum / f64(l)) +} diff --git a/math/stddev_test.jule b/math/stddev_test.jule new file mode 100644 index 0000000..5046b2f --- /dev/null +++ b/math/stddev_test.jule @@ -0,0 +1,12 @@ +#build test + +use "std/math" +use "std/testing" + +#test +fn testStddev(t: &testing::T) { + t.Assert(Stddev([]) == 0, "stddev of empty slice should be 0") + t.Assert(Stddev([5]) == 0, "stddev of single element should be 0") + t.Assert(Stddev([2, 4, 4, 4, 5, 5, 7, 9]) == 2, "stddev should be 2") + t.Assert(math::Abs(Stddev([1, 2, 3, 4, 5])-1.4142135623730951) < 1e-9, "stddev should be sqrt(2)") +}