tiny-rdm/backend/utils/math/math_util.go

84 lines
1.6 KiB
Go

package mathutil
import (
"math"
. "tinyrdm/backend/utils"
)
// MaxWithIndex 查找所有元素中的最大值
func MaxWithIndex[T Hashable](items ...T) (T, int) {
selIndex := -1
for i, t := range items {
if selIndex < 0 {
selIndex = i
} else {
if t > items[selIndex] {
selIndex = i
}
}
}
return items[selIndex], selIndex
}
// MinWithIndex 查找所有元素中的最小值
func MinWithIndex[T Hashable](items ...T) (T, int) {
selIndex := -1
for i, t := range items {
if selIndex < 0 {
selIndex = i
} else {
if t < items[selIndex] {
selIndex = i
}
}
}
return items[selIndex], selIndex
}
// Clamp 返回限制在minVal和maxVal范围内的value
func Clamp[T Hashable](value T, minVal T, maxVal T) T {
if minVal > maxVal {
minVal, maxVal = maxVal, minVal
}
if value < minVal {
value = minVal
} else if value > maxVal {
value = maxVal
}
return value
}
// Abs 计算绝对值
func Abs[T SignedNumber](val T) T {
return T(math.Abs(float64(val)))
}
// Floor 向下取整
func Floor[T SignedNumber | UnsignedNumber](val T) T {
return T(math.Floor(float64(val)))
}
// Ceil 向上取整
func Ceil[T SignedNumber | UnsignedNumber](val T) T {
return T(math.Ceil(float64(val)))
}
// Round 四舍五入取整
func Round[T SignedNumber | UnsignedNumber](val T) T {
return T(math.Round(float64(val)))
}
// Sum 计算所有元素总和
func Sum[T SignedNumber | UnsignedNumber](items ...T) T {
var sum T
for _, item := range items {
sum += item
}
return sum
}
// Average 计算所有元素的平均值
func Average[T SignedNumber | UnsignedNumber](items ...T) T {
return Sum(items...) / T(len(items))
}