Kotlin function which counts standard deviation

Here is the code. The code should counts the standard deviation for double array, but also for Int arrays.

fun calculateSD(numArray: DoubleArray): Double {
var sum = 0.0
var standardDeviation = 0.0

for (num in numArray) {
sum += num
}

val mean = sum / numArray.size

for (num in numArray) {
standardDeviation += Math.pow(num - mean, 2.0)
}

val divider = numArray.size - 1

return Math.sqrt(standardDeviation / divider )
}


You may want to be more idiomatic when working with collections, for an instance:

import kotlin.math.pow
import kotlin.math.sqrt

fun sd(data: DoubleArray): Double {
val mean = data.average()
return data
.fold(0.0, { accumulator, next -> accumulator + (next - mean).pow(2.0) })
.let { sqrt(it / data.size )
}
}


BTW, I don't think that data.size - 1 is correct

• There are two kinds of standard deviation. The sample standard deviation involves dividing by N - 1. Dec 17 '17 at 23:13
• True: en.wikipedia.org/wiki/Bessel%27s_correction . Do you think that this is the case here ? Dec 17 '17 at 23:27
• You could complain about unclear naming or lack of documentation for this function, but I'd hesitate to call it "wrong". Dec 17 '17 at 23:29
• I didn't do use the word wrong. Dec 17 '17 at 23:30

Performance

Something to consider (in general) is whether Math.pow(x, 2.0) is going to be optimized by the interpreter/compiler into x * x or not. The former can be slower if, say, it is computed as Math.exp(Math.log(x) * 2.0).

Instead of fold as in David Soroko answer you can use reduce:

import kotlin.math.pow

fun sd(data: DoubleArray): Double {
val mean = data.average()
return data
.reduce { acc, it -> acc + (mean - it).pow(2) }
.div(data.size)
.pow(0.5)
}