-
Notifications
You must be signed in to change notification settings - Fork 84
/
big.go
138 lines (112 loc) · 2.22 KB
/
big.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package math
import (
"math/big"
)
func Mul(x, y *big.Int) *big.Int {
return big.NewInt(0).Mul(x, y)
}
func Div(x, y *big.Int) *big.Int {
return big.NewInt(0).Div(x, y)
}
func Add(x, y *big.Int) *big.Int {
return big.NewInt(0).Add(x, y)
}
func Sub(x, y *big.Int) *big.Int {
return big.NewInt(0).Sub(x, y)
}
func Neg(x *big.Int) *big.Int {
return big.NewInt(0).Neg(x)
}
func Avg(x *big.Int, y *big.Int) *big.Int {
return Div(Add(x, y), big.NewInt(2))
}
func ToBigInt(s string) *big.Int {
res := big.NewInt(0)
res.SetString(s, 10)
return res
}
func Exp(x, y *big.Int) *big.Int {
return big.NewInt(0).Exp(x, y, nil)
}
func BigIntToBigFloat(a *big.Int) *big.Float {
b := new(big.Float).SetInt(a)
return b
}
func ToBigFraction(a, b *big.Int) *big.Rat {
return big.NewRat(1, 1).SetFrac(a, b)
}
func DivideToFloat(a, b *big.Int) float64 {
res, _ := big.NewRat(1, 1).SetFrac(a, b).Float64()
return res
}
func ToDecimal(value *big.Int) float64 {
bigFloatValue := BigIntToBigFloat(value)
result := DivFloat(bigFloatValue, big.NewFloat(1e18))
floatValue, _ := result.Float64()
return floatValue
}
func DivFloat(x, y *big.Float) *big.Float {
return big.NewFloat(0).Quo(x, y)
}
func Max(a, b *big.Int) *big.Int {
if a.Cmp(b) == 1 {
return a
} else {
return b
}
}
func IsZero(x *big.Int) bool {
if x.Cmp(big.NewInt(0)) == 0 {
return true
} else {
return false
}
}
func IsEqual(x, y *big.Int) bool {
if x.Cmp(y) == 0 {
return true
} else {
return false
}
}
func IsNotEqual(x, y *big.Int) bool {
if x.Cmp(y) != 0 {
return true
} else {
return false
}
}
func IsGreaterThan(x, y *big.Int) bool {
if x.Cmp(y) == 1 || x.Cmp(y) == 0 {
return true
} else {
return false
}
}
func IsStrictlyGreaterThan(x, y *big.Int) bool {
if x.Cmp(y) == 1 {
return true
} else {
return false
}
}
func IsSmallerThan(x, y *big.Int) bool {
if x.Cmp(y) == -1 || x.Cmp(y) == 0 {
return true
} else {
return false
}
}
func IsStrictlySmallerThan(x, y *big.Int) bool {
if x.Cmp(y) == -1 {
return true
} else {
return false
}
}
func IsEqualOrGreaterThan(x, y *big.Int) bool {
return (IsEqual(x, y) || IsGreaterThan(x, y))
}
func IsEqualOrSmallerThan(x, y *big.Int) bool {
return (IsEqual(x, y) || IsSmallerThan(x, y))
}