package math2 import "golang.org/x/exp/constraints" func Sign[T constraints.Signed](v T) int { if v > 0 { return 1 } if v < 0 { return -1 } return 0 } func Max[T constraints.Ordered](v1, v2 T) T { if v1 < v2 { return v2 } return v1 } func Min[T constraints.Ordered](v1, v2 T) T { if v1 < v2 { return v1 } return v2 } func Ceil[T constraints.Integer](v T, div T) T { return (v + div - 1) / div * div } func Floor[T constraints.Integer](v T, div T) T { return v / div * div } func CeilDiv[T constraints.Integer](v T, div T) T { return (v + div - 1) / div } func FloorDiv[T constraints.Integer](v T, div T) T { return v / div } func Clamp[T constraints.Integer](v, min, max T) T { if v < min { return min } if v > max { return max } return v } // 将一个整数切分成小于maxValue的整数列表,尽量均匀 func SplitLessThan[T constraints.Integer](v T, maxValue T) []T { cnt := int(CeilDiv(v, maxValue)) result := make([]T, cnt) last := int64(0) for i := 0; i < cnt; i++ { cur := int64(v) * int64(i+1) / int64(cnt) result[i] = T(cur - last) last = cur } return result } // 将一个整数切分成n个整数,尽量均匀 func SplitN[T constraints.Integer](v T, n int) []T { result := make([]T, n) last := int64(0) for i := 0; i < n; i++ { cur := int64(v) * int64(i+1) / int64(n) result[i] = T(cur - last) last = cur } return result } // 除法,如果除数为0,则返回默认值 func DivOrDefault[T constraints.Integer | constraints.Float](v, d T, def T) T { if d == 0 { return def } return v / d }