Open
Description
🧐 Motivation
The mulDiv
function defined in Math.sol
is very efficient in a generic case, but for specific cases better approaches could exist. Consider implementing optimized mulDiv
alternatives for special cases.
📝 Details
Add the following functions to Math.sol
:
mulDivFull(uint x, uint y, uint denominator) returns (uint)
: likemulDiv
but always does full division, skipping theprod1 == 0
check; useful for cases wherex*y
is very unlikely to fit into 256 bits.mulDivStatic(uint x, uint y, uint denominator, uint twos, uint inverse) returns (uint)
: likemulDiv
but accepts thetwos
andinverse
values as arguments, instead of than calculates them; useful for cases wheredenominator
is a constant or where the same denominator is used many times. Also consider a separate function to calculatetwos
andinverse
for a given denominator.shlDiv(uint x, uint sh, uint denominator) returns (uint)
: likemulDiv
but performs left shift instead of multiplication; useful for cases where one of the factors is a known power of two. Also consider functionsshlDivFull
andshlDivStatic
.mulShr(uint x, uint y, uint sh) returns (uint)
: likemulDiv
but performs right shift instead of division; useful for cases wheredenominator
is a known power of two. Also consider functionmulShrFull
.mulDiv128(uint x, uint y, uint128 denominator) returns (uint)
: likemulDiv
but with 128-bit denominator, which more efficient implementation (https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1#4821); useful for cases wheredenominator
is guaranteed to fit into 128 bits.