...
Tawesoft Logo

Source file src/tawesoft.co.uk/go/operator/float64.go

Documentation: src/tawesoft.co.uk/go/operator/float64.go

     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  
   230  

View as plain text