github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/f/numerics.go (about) 1 package f 2 3 import ( 4 "math" 5 "reflect" 6 ) 7 8 // Abs returns absolute value of number 9 func Abs(value float64) float64 { 10 return math.Abs(value) 11 } 12 13 // Sign returns sign of number: 1 in case of value > 0, -1 in case of value < 0, 0 otherwise 14 func Sign(value float64) float64 { 15 if value > 0 { 16 return 1 17 } else if value < 0 { 18 return -1 19 } else { 20 return 0 21 } 22 } 23 24 // IsNegative returns true if value < 0 25 func IsNegative(value float64) bool { 26 return value < 0 27 } 28 29 // IsPositive returns true if value > 0 30 func IsPositive(value float64) bool { 31 return value > 0 32 } 33 34 // IsNonNegative returns true if value >= 0 35 func IsNonNegative(value float64) bool { 36 return value >= 0 37 } 38 39 // IsNonPositive returns true if value <= 0 40 func IsNonPositive(value float64) bool { 41 return value <= 0 42 } 43 44 // InRange returns true if value lies between left and right border 45 func InRangeInt(value, left, right interface{}) bool { 46 value64, _ := ToInt(value) 47 left64, _ := ToInt(left) 48 right64, _ := ToInt(right) 49 if left64 > right64 { 50 left64, right64 = right64, left64 51 } 52 return value64 >= left64 && value64 <= right64 53 } 54 55 // InRange returns true if value lies between left and right border 56 func InRangeFloat32(value, left, right float32) bool { 57 if left > right { 58 left, right = right, left 59 } 60 return value >= left && value <= right 61 } 62 63 // InRange returns true if value lies between left and right border 64 func InRangeFloat64(value, left, right float64) bool { 65 if left > right { 66 left, right = right, left 67 } 68 return value >= left && value <= right 69 } 70 71 // InRange returns true if value lies between left and right border, generic type to handle int, float32 or float64, all types must the same type 72 func InRange(value interface{}, left interface{}, right interface{}) bool { 73 reflectValue := reflect.TypeOf(value).Kind() 74 reflectLeft := reflect.TypeOf(left).Kind() 75 reflectRight := reflect.TypeOf(right).Kind() 76 77 if reflectValue == reflect.Int && reflectLeft == reflect.Int && reflectRight == reflect.Int { 78 return InRangeInt(value.(int), left.(int), right.(int)) 79 } else if reflectValue == reflect.Float32 && reflectLeft == reflect.Float32 && reflectRight == reflect.Float32 { 80 return InRangeFloat32(value.(float32), left.(float32), right.(float32)) 81 } else if reflectValue == reflect.Float64 && reflectLeft == reflect.Float64 && reflectRight == reflect.Float64 { 82 return InRangeFloat64(value.(float64), left.(float64), right.(float64)) 83 } else { 84 return false 85 } 86 } 87 88 // IsWhole returns true if value is whole number 89 func IsWhole(value float64) bool { 90 return math.Remainder(value, 1) == 0 91 } 92 93 // IsNatural returns true if value is natural number (positive and whole) 94 func IsNatural(value float64) bool { 95 return IsWhole(value) && IsPositive(value) 96 }