You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

math.go 1.3 kB

1 year ago
11 months ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package math2
  2. import "golang.org/x/exp/constraints"
  3. func Max[T constraints.Ordered](v1, v2 T) T {
  4. if v1 < v2 {
  5. return v2
  6. }
  7. return v1
  8. }
  9. func Min[T constraints.Ordered](v1, v2 T) T {
  10. if v1 < v2 {
  11. return v1
  12. }
  13. return v2
  14. }
  15. func Ceil[T constraints.Integer](v T, div T) T {
  16. return (v + div - 1) / div * div
  17. }
  18. func Floor[T constraints.Integer](v T, div T) T {
  19. return v / div * div
  20. }
  21. func CeilDiv[T constraints.Integer](v T, div T) T {
  22. return (v + div - 1) / div
  23. }
  24. func FloorDiv[T constraints.Integer](v T, div T) T {
  25. return v / div
  26. }
  27. func Clamp[T constraints.Integer](v, min, max T) T {
  28. if v < min {
  29. return min
  30. }
  31. if v > max {
  32. return max
  33. }
  34. return v
  35. }
  36. // 将一个整数切分成小于maxValue的整数列表,尽量均匀
  37. func SplitLessThan[T constraints.Integer](v T, maxValue T) []T {
  38. cnt := int(CeilDiv(v, maxValue))
  39. result := make([]T, cnt)
  40. last := int64(0)
  41. for i := 0; i < cnt; i++ {
  42. cur := int64(v) * int64(i+1) / int64(cnt)
  43. result[i] = T(cur - last)
  44. last = cur
  45. }
  46. return result
  47. }
  48. // 将一个整数切分成n个整数,尽量均匀
  49. func SplitN[T constraints.Integer](v T, n int) []T {
  50. result := make([]T, n)
  51. last := int64(0)
  52. for i := 0; i < n; i++ {
  53. cur := int64(v) * int64(i+1) / int64(n)
  54. result[i] = T(cur - last)
  55. last = cur
  56. }
  57. return result
  58. }