FullMath

Git Source

Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision

Modified from the original UniswapV3 library to support v0.8 From: uint256 twos = -denominator & denominator; To: uint256 twos = (type(uint256).max - denominator + 1) & denominator;

Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits

Functions

mulDiv

Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0

Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv

function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result);

Parameters

NameTypeDescription
auint256The multiplicand
buint256The multiplier
denominatoruint256The divisor

Returns

NameTypeDescription
resultuint256The 256-bit result

mulDivRoundingUp

Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0

This line was modified for v0.8.x

function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result);

Parameters

NameTypeDescription
auint256The multiplicand
buint256The multiplier
denominatoruint256The divisor

Returns

NameTypeDescription
resultuint256The 256-bit result