FractionalExponents
FractionalExponents
ONE
uint256 ONE
MAX_WEIGHT
uint32 MAX_WEIGHT
MIN_PRECISION
uint8 MIN_PRECISION
MAX_PRECISION
uint8 MAX_PRECISION
FIXED_1
uint256 FIXED_1
FIXED_2
uint256 FIXED_2
MAX_NUM
uint256 MAX_NUM
LN2_NUMERATOR
uint256 LN2_NUMERATOR
LN2_DENOMINATOR
uint256 LN2_DENOMINATOR
OPT_LOG_MAX_VAL
uint256 OPT_LOG_MAX_VAL
OPT_EXP_MAX_VAL
uint256 OPT_EXP_MAX_VAL
maxExpArray
uint256[128] maxExpArray
BancorFormula
function BancorFormula() public
power
function power(uint256 _baseN, uint256 _baseD, uint32 _expN, uint32 _expD) public view returns (uint256, uint8)
General Description: Determine a value of precision. Calculate an integer approximation of (_baseN / _baseD) ^ (_expN / _expD) 2 ^ precision. Return the result along with the precision used. Detailed Description: Instead of calculating "base ^ exp", we calculate "e ^ (log(base) exp)". The value of "log(base)" is represented with an integer slightly smaller than "log(base) * 2 ^ precision". The larger "precision" is, the more accurately this value represents the real value. However, the larger "precision" is, the more bits are required in order to store this value. And the exponentiation function, which takes "x" and calculates "e ^ x", is limited to a maximum exponent (maximum value of "x"). This maximum exponent depends on the "precision" used, and it is given by "maxExpArray[precision] >> (MAX_PRECISION - precision)". Hence we need to determine the highest precision which can be used for the given input, before calling the exponentiation function. This allows us to compute "base ^ exp" with maximum accuracy and without exceeding 256 bits in any of the intermediate computations. This functions assumes that "_expN < 2 ^ 256 / log(MAX_NUM - 1)", otherwise the multiplication should be replaced with a "safeMul".
generalLog
function generalLog(uint256 x) internal pure returns (uint256)
Compute log(x / FIXED_1) * FIXED_1. This functions assumes that "x >= FIXED_1", because the output would be negative otherwise.
floorLog2
function floorLog2(uint256 _n) internal pure returns (uint8)
Compute the largest integer smaller than or equal to the binary logarithm of the input.
findPositionInMaxExpArray
function findPositionInMaxExpArray(uint256 _x) internal view returns (uint8)
The global "maxExpArray" is sorted in descending order, and therefore the following statements are equivalent:
- This function finds the position of [the smallest value in "maxExpArray" larger than or equal to "x"]
- This function finds the highest position of [a value in "maxExpArray" larger than or equal to "x"]
generalExp
function generalExp(uint256 _x, uint8 _precision) internal pure returns (uint256)
This function can be auto-generated by the script 'PrintFunctionGeneralExp.py'. It approximates "e ^ x" via maclaurin summation: "(x^0)/0! + (x^1)/1! + ... + (x^n)/n!". It returns "e ^ (x / 2 ^ precision) * 2 ^ precision", that is, the result is upshifted for accuracy. The global "maxExpArray" maps each "precision" to "((maximumExponent + 1) << (MAX_PRECISION - precision)) - 1". The maximum permitted value for "x" is therefore given by "maxExpArray[precision] >> (MAX_PRECISION - precision)".
optimalLog
function optimalLog(uint256 x) internal pure returns (uint256)
Return log(x / FIXED_1) * FIXED_1 Input range: FIXED_1 <= x <= LOG_EXP_MAX_VAL - 1
optimalExp
function optimalExp(uint256 x) internal pure returns (uint256)
Return e ^ (x / FIXED_1) * FIXED_1 Input range: 0 <= x <= OPT_EXP_MAX_VAL - 1