1
0
mirror of https://github.com/charlienet/go-mixed.git synced 2025-07-18 08:32:40 +08:00
This commit is contained in:
2022-11-18 16:53:59 +08:00
parent 6e24cf5bdc
commit b76be4ce6b
17 changed files with 103 additions and 180 deletions

View File

@ -3,18 +3,32 @@ package mathx
import (
"github.com/charlienet/go-mixed/expr"
"golang.org/x/exp/constraints"
"unsafe"
)
// MaxInt returns the larger one of v1 and v2.
// Max returns the larger one of v1 and v2.
func Max[T constraints.Ordered](v1, v2 T) T {
return expr.Ternary(v1 > v2, v1, v2)
}
// MinInt returns the smaller one of v1 and v2.
// Min returns the smaller one of v1 and v2.
func Min[T constraints.Ordered](v1, v2 T) T {
return expr.Ternary(v1 < v2, v1, v2)
}
func Abs1[T constraints.Signed](n T) T {
shift := 63
switch unsafe.Sizeof(n) {
case 1:
shift = 7
case 4:
shift = 31
}
y := n >> shift
return T((n ^ y) - y)
}
func Abs(n int64) int64 {
y := n >> 63
return (n ^ y) - y

27
mathx/int_test.go Normal file
View File

@ -0,0 +1,27 @@
package mathx_test
import (
"github.com/charlienet/go-mixed/mathx"
"github.com/stretchr/testify/assert"
"testing"
)
func TestMin(t *testing.T) {
assert.Equal(t, 1, mathx.Min(1, 3))
assert.Equal(t, 2, mathx.Min(66, 2))
}
func TestMax(t *testing.T) {
assert.Equal(t, 3, mathx.Max(1, 3))
assert.Equal(t, 66, mathx.Max(66, 2))
}
func TestAbs(t *testing.T) {
assert.Equal(t, 23, mathx.Abs1(23))
assert.Equal(t, 23, mathx.Abs1(-23))
assert.Equal(t, 0, mathx.Abs1(0))
var u int8 = -127
var exp int8 = 127
assert.Equal(t, exp, mathx.Abs1(u))
}