/
numbers.go
58 lines (52 loc) · 1.01 KB
/
numbers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package types
import (
"errors"
"math/big"
)
const (
ErrZeroDividend = "Dividend is zero "
ErrIntOverflow = "Int Overflow "
)
func Mul64(a, b int64) (int64, bool) {
if a == 0 || b == 0 {
return 0, true
}
c := a * b
if (c < 0) == ((a < 0) != (b < 0)) {
if c/b == a {
return c, true
}
}
return c, false
}
func MulQuoDec(a, b, c Dec) (Dec, error) {
if c.IsZero() {
return Dec{}, errors.New(ErrZeroDividend)
}
r, ok := Mul64(a.RawInt(), b.RawInt())
if !ok {
var bi big.Int
bi.Quo(bi.Mul(big.NewInt(a.RawInt()), big.NewInt(b.RawInt())), big.NewInt(c.RawInt()))
if !bi.IsInt64() {
return Dec{}, errors.New(ErrIntOverflow)
}
return NewDec(bi.Int64()), nil
}
return NewDec(r / c.RawInt()), nil
}
func MulBigInt(a, b *big.Int) *big.Int {
if a == nil || b == nil {
panic("arguments can not be nil")
}
var bi big.Int
bi.Mul(a, b)
return &bi
}
func QuoBigInt(a, b *big.Int) *big.Int {
if a == nil || b == nil {
panic("arguments can not be nil")
}
var bi big.Int
bi.Quo(a, b)
return &bi
}