Source file
src/tawesoft.co.uk/go/operator/float64.go
Documentation:
src/tawesoft.co.uk/go/operator/float64.go
1 package operator
2
3
4
5 import "math"
6
7
8
9 type float64Unary struct {
10 Identity func(float64) float64
11 Abs func(float64) float64
12 Negation func(float64) float64
13 Zero func(float64) bool
14 NonZero func(float64) bool
15 Positive func(float64) bool
16 Negative func(float64) bool
17 }
18
19 type float64UnaryChecked struct {
20 Abs func(float64) (float64, error)
21 Negation func(float64) (float64, error)
22 }
23
24 type float64Binary struct {
25 Add func(float64, float64) float64
26 Sub func(float64, float64) float64
27 Mul func(float64, float64) float64
28 Div func(float64, float64) float64
29 Mod func(float64, float64) float64
30
31 Eq func(float64, float64) bool
32 Neq func(float64, float64) bool
33 Lt func(float64, float64) bool
34 Lte func(float64, float64) bool
35 Gt func(float64, float64) bool
36 Gte func(float64, float64) bool
37
38
39 }
40
41 type float64BinaryChecked struct {
42 Add func(float64, float64) (float64, error)
43 Sub func(float64, float64) (float64, error)
44 Mul func(float64, float64) (float64, error)
45 Div func(float64, float64) (float64, error)
46
47 }
48
49 type float64Nary struct {
50 Add func(... float64) float64
51 Sub func(... float64) float64
52 Mul func(... float64) float64
53 }
54
55 type float64NaryChecked struct {
56 Add func(... float64) (float64, error)
57 Sub func(... float64) (float64, error)
58 Mul func(... float64) (float64, error)
59 }
60
61
62 var Float64 = struct {
63 Unary float64Unary
64 Binary float64Binary
65 Nary float64Nary
66 Reduce func(operatorIdentity float64, operator func(float64, float64) float64, elements ... float64) float64
67 }{
68 Unary: float64Unary{
69 Identity: func(a float64) float64 { return a },
70 Abs: float64UnaryAbs,
71 Negation: func(a float64) float64 { return -a },
72 Zero: func(a float64) bool { return a == 0 },
73 NonZero: func(a float64) bool { return a != 0 },
74 Positive: float64UnaryPositive,
75 Negative: float64UnaryNegative,
76 },
77
78 Binary: float64Binary{
79 Add: func(a float64, b float64) float64 { return a + b },
80 Sub: func(a float64, b float64) float64 { return a - b },
81 Mul: func(a float64, b float64) float64 { return a * b },
82 Div: func(a float64, b float64) float64 { return a / b },
83
84 Eq: func(a float64, b float64) bool { return a == b },
85 Neq: func(a float64, b float64) bool { return a != b },
86 Lt: func(a float64, b float64) bool { return a < b },
87 Lte: func(a float64, b float64) bool { return a <= b },
88 Gt: func(a float64, b float64) bool { return a > b },
89 Gte: func(a float64, b float64) bool { return a >= b },
90
91
92 },
93
94 Nary: float64Nary{
95 Add: float64NaryAdd,
96 Mul: float64NaryMul,
97 },
98
99 Reduce: float64Reduce,
100 }
101
102
103
104 var Float64Checked = struct {
105 Unary float64UnaryChecked
106 Binary float64BinaryChecked
107 Nary float64NaryChecked
108 Reduce func(operatorIdentity float64, operator func(float64, float64) (float64, error), elements ... float64) (float64, error)
109 }{
110 Unary: float64UnaryChecked{
111 Abs: float64UnaryCheckedAbs,
112 Negation: float64UnaryCheckedNegation,
113 },
114
115 Binary: float64BinaryChecked{
116 Add: float64BinaryCheckedAdd,
117 Sub: float64BinaryCheckedSub,
118 Mul: float64BinaryCheckedMul,
119 Div: float64BinaryCheckedDiv,
120 },
121
122 Nary: float64NaryChecked{
123 Add: float64NaryCheckedAdd,
124 Mul: float64NaryCheckedMul,
125 },
126
127 Reduce: float64CheckedReduce,
128 }
129
130 func float64UnaryPositive(a float64) bool {
131 return math.Signbit(float64(a)) == false
132 }
133
134 func float64UnaryNegative(a float64) bool {
135 return math.Signbit(float64(a)) == true
136 }
137
138 func float64UnaryAbs(a float64) float64 {
139 return float64(math.Abs(float64(a)))
140 }
141
142
143 func float64UnaryCheckedAbs(a float64) (v float64, err error) {
144 if math.IsNaN(float64(a)) { return v, ErrorNaN }
145 return float64(math.Abs(float64(a))), nil
146 }
147
148 func float64UnaryCheckedNegation(a float64) (v float64, err error) {
149 if math.IsNaN(float64(a)) { return v, ErrorNaN }
150 return -a, nil
151 }
152
153 func float64BinaryCheckedAdd(a float64, b float64) (v float64, err error) {
154 if (b > 0) && (a > (maxFloat64 - b)) { return v, ErrorOverflow }
155 if (b < 0) && (a < (minFloat64 - b)) { return v, ErrorOverflow }
156 return a + b, nil
157 }
158
159 func float64BinaryCheckedSub(a float64, b float64) (v float64, err error) {
160 if (b < 0) && (a > (maxFloat64 + b)) { return v, ErrorOverflow }
161 if (b > 0) && (a < (minFloat64 + b)) { return v, ErrorOverflow }
162 return a - b, nil
163 }
164
165 func float64BinaryCheckedMul(a float64, b float64) (v float64, err error) {
166 if (a > (maxFloat64 / b)) { return v, ErrorOverflow }
167 if (a < (minFloat64 / b)) { return v, ErrorOverflow }
168
169 return a * b, nil
170 }
171
172 func float64BinaryCheckedDiv(a float64, b float64) (v float64, err error) {
173 if math.IsNaN(float64(a)) { return v, ErrorNaN }
174 if (b == 0) { return v, ErrorUndefined }
175
176 return a / b, nil
177 }
178
179
180
181 func float64NaryAdd(xs ... float64) (result float64) {
182 for i := 0; i < len(xs); i++ {
183 result += xs[i]
184 }
185 return result
186 }
187
188 func float64NaryCheckedAdd(xs ... float64) (result float64, err error) {
189 for i := 0; i < len(xs); i++ {
190 result, err = float64BinaryCheckedAdd(result, xs[i])
191 if err != nil { return result, err }
192 }
193 return result, nil
194 }
195
196 func float64NaryMul(xs ... float64) (result float64) {
197 result = 1
198 for i := 0; i < len(xs); i++ {
199 result *= xs[i]
200 }
201 return result
202 }
203
204 func float64NaryCheckedMul(xs ... float64) (result float64, err error) {
205 result = 1
206 for i := 0; i < len(xs); i++ {
207 result, err = float64BinaryCheckedMul(result, xs[i])
208 if err != nil { return result, err }
209 }
210 return result, nil
211 }
212
213 func float64Reduce(operatorIdentity float64, operator func(float64, float64) float64, elements ... float64) (result float64) {
214 result = operatorIdentity
215 for i := 0; i < len(elements); i++ {
216 result = operator(result, elements[i])
217 }
218 return result
219 }
220
221 func float64CheckedReduce(operatorIdentity float64, operator func(float64, float64) (float64, error), elements ... float64) (result float64, err error) {
222 result = operatorIdentity
223 for i := 0; i < len(elements); i++ {
224 result, err = operator(result, elements[i])
225 if err != nil { return result, err }
226 }
227 return result, err
228 }
229
230
View as plain text