# Exponentiation

The main formulas used in Balancer protocol make use of a form of exponentiation where both the base and exponent are fixed-point (non-integer) values. Take for example the `swap` functions, where the weights in both the exponent and the base are fractions:

$$
A\_o = \left(1 - \left(\frac{B\_i}{B\_i+A\_i}\right)^{\frac{W\_i}{W\_o}}\right).B\_o
$$

$$
\begin{equation} \begin{gathered} A\_i = \left(\left(\frac{B\_o}{B\_o-A\_o}\right)^{\frac{W\_o}{W\_i}}-1\right).B\_i \end{gathered} \end{equation}
$$

Since solidity does not have fixed point algebra or more complex functions like fractional power we use the following binomial approximation:

$$
\begin{equation} \begin{gathered} \left(1+x\right)^\alpha=1+\alpha x+\frac{(\alpha)(\alpha-1)}{2!}x^2+ \frac{(\alpha)(\alpha-1)(\alpha-2)}{3!}x^3+ \cdots = \sum\_{k=0}^{\infty}{\alpha \choose k}x^k \end{gathered} \end{equation}
$$

which converges for $${|x| < 1}$$.

When $$\alpha>1$$ we split the calculation into two parts for increased accuracy, the first is the exponential with the integer part of $$\alpha$$ (which we can calculate exactly) and the second is the exponential with the fractional part of $$\alpha$$:

$$
\begin{equation}
\begin{gathered}
A\_i = \left(1 - \left(\frac{B\_o}{B\_o-A\_o}\right)^{int\left(\frac{W\_o}{W\_i}\right)}\left(\frac{B\_o}{B\_o-A\_o}\right)^{\frac{W\_o}{W\_i}%1}\right).B\_i
\end{gathered}
\end{equation}
$$
