# 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 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, 2017 at 23:13
• True: en.wikipedia.org/wiki/Bessel%27s_correction . Do you think that this is the case here ? Dec 17, 2017 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, 2017 at 23:29
• data.sumOf { (next - mean).pow(2) } instead of aggregate is simpler, but requires kotlin 1.4. Aug 9, 2023 at 21:55
• Did you mean "instead of fold" ? Aug 10, 2023 at 19:43

## 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).