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  }