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.6 kB

1 year ago
11 months ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package math2
  2. import "golang.org/x/exp/constraints"
  3. func Sign[T constraints.Signed](v T) int {
  4. if v > 0 {
  5. return 1
  6. }
  7. if v < 0 {
  8. return -1
  9. }
  10. return 0
  11. }
  12. func Max[T constraints.Ordered](v1, v2 T) T {
  13. if v1 < v2 {
  14. return v2
  15. }
  16. return v1
  17. }
  18. func Min[T constraints.Ordered](v1, v2 T) T {
  19. if v1 < v2 {
  20. return v1
  21. }
  22. return v2
  23. }
  24. func Ceil[T constraints.Integer](v T, div T) T {
  25. return (v + div - 1) / div * div
  26. }
  27. func Floor[T constraints.Integer](v T, div T) T {
  28. return v / div * div
  29. }
  30. func CeilDiv[T constraints.Integer](v T, div T) T {
  31. return (v + div - 1) / div
  32. }
  33. func FloorDiv[T constraints.Integer](v T, div T) T {
  34. return v / div
  35. }
  36. func Clamp[T constraints.Integer](v, min, max T) T {
  37. if v < min {
  38. return min
  39. }
  40. if v > max {
  41. return max
  42. }
  43. return v
  44. }
  45. // 将一个整数切分成小于maxValue的整数列表,尽量均匀
  46. func SplitLessThan[T constraints.Integer](v T, maxValue T) []T {
  47. cnt := int(CeilDiv(v, maxValue))
  48. result := make([]T, cnt)
  49. last := int64(0)
  50. for i := 0; i < cnt; i++ {
  51. cur := int64(v) * int64(i+1) / int64(cnt)
  52. result[i] = T(cur - last)
  53. last = cur
  54. }
  55. return result
  56. }
  57. // 将一个整数切分成n个整数,尽量均匀
  58. func SplitN[T constraints.Integer](v T, n int) []T {
  59. result := make([]T, n)
  60. last := int64(0)
  61. for i := 0; i < n; i++ {
  62. cur := int64(v) * int64(i+1) / int64(n)
  63. result[i] = T(cur - last)
  64. last = cur
  65. }
  66. return result
  67. }
  68. // 除法,如果除数为0,则返回默认值
  69. func DivOrDefault[T constraints.Integer | constraints.Float](v, d T, def T) T {
  70. if d == 0 {
  71. return def
  72. }
  73. return v / d
  74. }