26 lines
586 B
Go
26 lines
586 B
Go
|
package stats
|
||
|
|
||
|
import "math"
|
||
|
|
||
|
// Median gets the median number in a slice of numbers
|
||
|
func Median(input Float64Data) (median float64, err error) {
|
||
|
|
||
|
// Start by sorting a copy of the slice
|
||
|
c := sortedCopy(input)
|
||
|
|
||
|
// No math is needed if there are no numbers
|
||
|
// For even numbers we add the two middle numbers
|
||
|
// and divide by two using the mean function above
|
||
|
// For odd numbers we just use the middle number
|
||
|
l := len(c)
|
||
|
if l == 0 {
|
||
|
return math.NaN(), EmptyInputErr
|
||
|
} else if l%2 == 0 {
|
||
|
median, _ = Mean(c[l/2-1 : l/2+1])
|
||
|
} else {
|
||
|
median = c[l/2]
|
||
|
}
|
||
|
|
||
|
return median, nil
|
||
|
}
|