expdecay.go raw

   1  package blockchain
   2  
   3  /*
   4  import "math/big"
   5  // Root is a high precision arbitrary fractional root function used for the post p9 hardfork reward calculation
   6  func Root(a *big.Float, n float64) *big.Float {
   7  limit := Exp(New(2), 256)
   8  	n1 := n - 1
   9  	n1f, rn := New(float64(n1)), Div(New(1.0), New(float64(n)))
  10  	x, x0 := New(1.0), Zero()
  11  	_ = x0
  12  	for {
  13  potx, t2 := Div(New(1.0), x), a
  14  		for b := n1; b > 0; b >>= 1 {
  15  if b&1 == 1 {
  16  t2 = Mul(t2, potx)
  17  			}
  18  			potx = Mul(potx, potx)
  19  		}
  20  		x0, x = x, Mul(rn, Add(Mul(n1f, x), t2))
  21  		if Lesser(Mul(Abs(Sub(x, x0)), limit), x) {
  22  			break
  23  		}
  24  	}
  25  	return x
  26  }
  27  func Abs(a *big.Float) *big.Float {
  28  return Zero().Abs(a)
  29  }
  30  func Exp(a *big.Float, e uint64) *big.Float {
  31  result := Zero().Copy(a)
  32  	for i := uint64(0); i < e-1; i++ {
  33  result = Mul(result, a)
  34  	}
  35  	return result
  36  }
  37  func New(f float64) *big.Float {
  38  r := big.NewFloat(f)
  39  	r.SetPrec(256)
  40  	return r
  41  }
  42  func Div(a, b *big.Float) *big.Float {
  43  return Zero().Quo(a, b)
  44  }
  45  func Zero() *big.Float {
  46  r := big.NewFloat(0.0)
  47  	r.SetPrec(256)
  48  	return r
  49  }
  50  func Mul(a, b *big.Float) *big.Float {
  51  return Zero().Mul(a, b)
  52  }
  53  func Add(a, b *big.Float) *big.Float {
  54  return Zero().Add(a, b)
  55  }
  56  func Sub(a, b *big.Float) *big.Float {
  57  return Zero().Sub(a, b)
  58  }
  59  func Lesser(x, y *big.Float) bool {
  60  return x.Cmp(y) == -1
  61  }
  62  */
  63