github.com/tawesoft/golib/v2@v2.10.0/legacy/operator/float64.go (about) 1 package operator 2 3 // Code generated by (tawesoft.co.uk/go/operator) template-numbers.py: DO NOT EDIT. 4 5 import "math" 6 7 // Some overflow checks with reference to stackoverflow.com/a/1514309/5654201 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 // Float64 implements operations on one (unary), two (binary), or many (nary) arguments of type float64. 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 // Float64Checked implements operations on one (unary), two (binary), or many (nary) arguments of type float64, returning an 103 // error in cases such as overflow or an undefined operation. 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 // note abs(+/- Inf) = +Inf 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