gitee.com/quant1x/num@v0.3.2/stddev.go (about) 1 package num 2 3 import ( 4 "gitee.com/quant1x/num/x32" 5 "gitee.com/quant1x/num/x64" 6 "math" 7 "slices" 8 ) 9 10 // Std 计算标准差 11 func Std[T BaseType](x []T) T { 12 if len(x) == 0 { 13 return TypeDefault[T]() 14 } 15 var d any 16 switch fs := any(x).(type) { 17 case []float32: 18 d = __go_std_float32(fs) 19 case []float64: 20 d = __go_std_float64(fs) 21 default: 22 // 应该不会走到这里 23 panic(ErrUnsupportedType) 24 } 25 26 return d.(T) 27 } 28 29 func __go_std_float64(f []float64) float64 { 30 values := slices.Clone(f) 31 // 求平均数 32 mean := x64.Mean(values) 33 // 减去 平均数 34 x64.SubNumber_Inplace(values, mean) 35 // 计算方差 36 y := x64.Repeat(2.00, len(f)) 37 x64.Pow_Inplace(values, y) 38 // 再求方差平均数 39 mean = x64.Mean(values) 40 mean = math.Sqrt(mean) 41 return mean 42 } 43 44 func __go_std_float32(f []float32) float32 { 45 values := slices.Clone(f) 46 // 求平均数 47 mean := x32.Mean(values) 48 // 减去 平均数 49 x32.SubNumber_Inplace(values, mean) 50 // 计算方差 51 y := x32.Repeat(2.00, len(f)) 52 x32.Pow_Inplace(values, y) 53 // 再求方差平均数 54 mean = x32.Mean(values) 55 mean = float32(math.Sqrt(float64(mean))) 56 return mean 57 }