Skip to content

Commit

Permalink
Add more FPM tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Vectorized committed Dec 13, 2023
1 parent 96dac37 commit 90f623f
Show file tree
Hide file tree
Showing 2 changed files with 174 additions and 80 deletions.
162 changes: 82 additions & 80 deletions .gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -365,126 +365,128 @@ ERC721Test:testTransferFromSelf(uint256) (runs: 256, μ: 92785, ~: 92758)
ERC721Test:testTransferFromToZeroReverts(uint256) (runs: 256, μ: 79043, ~: 79023)
ERC721Test:testTransferFromWrongFromReverts(address,uint256) (runs: 256, μ: 80411, ~: 80390)
ERC721Test:test__codesize() (gas: 41923)
FixedPointMathLibTest:testAbs() (gas: 578)
FixedPointMathLibTest:testAbs(int256) (runs: 256, μ: 517, ~: 485)
FixedPointMathLibTest:testAbs() (gas: 600)
FixedPointMathLibTest:testAbs(int256) (runs: 256, μ: 538, ~: 507)
FixedPointMathLibTest:testAbsEdgeCases() (gas: 410)
FixedPointMathLibTest:testAvg() (gas: 442)
FixedPointMathLibTest:testAvgEdgeCase() (gas: 492)
FixedPointMathLibTest:testAvgEdgeCase() (gas: 425)
FixedPointMathLibTest:testAvgSigned() (gas: 897)
FixedPointMathLibTest:testCbrt() (gas: 10261)
FixedPointMathLibTest:testCbrt(uint256) (runs: 256, μ: 1424, ~: 1513)
FixedPointMathLibTest:testCbrtBack(uint256) (runs: 256, μ: 30967, ~: 36168)
FixedPointMathLibTest:testCbrt() (gas: 10283)
FixedPointMathLibTest:testCbrt(uint256) (runs: 256, μ: 1446, ~: 1535)
FixedPointMathLibTest:testCbrtBack(uint256) (runs: 256, μ: 31549, ~: 39721)
FixedPointMathLibTest:testCbrtWad() (gas: 12006)
FixedPointMathLibTest:testCbrtWad(uint256) (runs: 256, μ: 1997, ~: 2005)
FixedPointMathLibTest:testClamp(uint256,uint256,uint256) (runs: 256, μ: 546, ~: 546)
FixedPointMathLibTest:testClampSigned(int256,int256,int256) (runs: 256, μ: 611, ~: 611)
FixedPointMathLibTest:testDist() (gas: 634)
FixedPointMathLibTest:testCbrtWad(uint256) (runs: 256, μ: 1996, ~: 2005)
FixedPointMathLibTest:testClamp(uint256,uint256,uint256) (runs: 256, μ: 568, ~: 568)
FixedPointMathLibTest:testClampSigned(int256,int256,int256) (runs: 256, μ: 547, ~: 547)
FixedPointMathLibTest:testDist() (gas: 656)
FixedPointMathLibTest:testDist(int256,int256) (runs: 256, μ: 518, ~: 514)
FixedPointMathLibTest:testDistEdgeCases() (gas: 570)
FixedPointMathLibTest:testDistEdgeCases() (gas: 505)
FixedPointMathLibTest:testDivWad() (gas: 702)
FixedPointMathLibTest:testDivWad(uint256,uint256) (runs: 256, μ: 793, ~: 913)
FixedPointMathLibTest:testDivWad(uint256,uint256) (runs: 256, μ: 732, ~: 846)
FixedPointMathLibTest:testDivWadEdgeCases() (gas: 458)
FixedPointMathLibTest:testDivWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3749, ~: 3749)
FixedPointMathLibTest:testDivWadUp() (gas: 3062)
FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 256, μ: 787, ~: 942)
FixedPointMathLibTest:testDivWadUpEdgeCases() (gas: 483)
FixedPointMathLibTest:testDivWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3748, ~: 3748)
FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts() (gas: 3239)
FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts(uint256) (runs: 256, μ: 3273, ~: 3273)
FixedPointMathLibTest:testDivWadZeroDenominatorReverts() (gas: 3240)
FixedPointMathLibTest:testDivWadZeroDenominatorReverts(uint256) (runs: 256, μ: 3315, ~: 3315)
FixedPointMathLibTest:testDivWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3771, ~: 3771)
FixedPointMathLibTest:testDivWadUp() (gas: 3084)
FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 256, μ: 795, ~: 942)
FixedPointMathLibTest:testDivWadUpEdgeCases() (gas: 416)
FixedPointMathLibTest:testDivWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3770, ~: 3770)
FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts() (gas: 3261)
FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts(uint256) (runs: 256, μ: 3295, ~: 3295)
FixedPointMathLibTest:testDivWadZeroDenominatorReverts() (gas: 3262)
FixedPointMathLibTest:testDivWadZeroDenominatorReverts(uint256) (runs: 256, μ: 3337, ~: 3337)
FixedPointMathLibTest:testExpWad() (gas: 7544)
FixedPointMathLibTest:testFactorial() (gas: 98825)
FixedPointMathLibTest:testExpWadDifferential(int256) (runs: 256, μ: 10853, ~: 1293)
FixedPointMathLibTest:testFactorial() (gas: 98759)
FixedPointMathLibTest:testFactorialOriginal() (gas: 94187)
FixedPointMathLibTest:testFullMulDiv() (gas: 1189)
FixedPointMathLibTest:testFullMulDiv(uint256,uint256,uint256) (runs: 256, μ: 1384, ~: 996)
FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 1744, ~: 1539)
FixedPointMathLibTest:testFullMulDiv() (gas: 1211)
FixedPointMathLibTest:testFullMulDiv(uint256,uint256,uint256) (runs: 256, μ: 1381, ~: 996)
FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 1758, ~: 1561)
FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase1() (gas: 3688)
FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase2() (gas: 3699)
FixedPointMathLibTest:testGcd() (gas: 4206)
FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 256, μ: 4945, ~: 2223)
FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 256, μ: 5253, ~: 2245)
FixedPointMathLibTest:testLambertW0WadAccuracy() (gas: 7194)
FixedPointMathLibTest:testLambertW0WadAccuracy(uint184) (runs: 256, μ: 1951, ~: 386)
FixedPointMathLibTest:testLambertW0WadAccuracy(uint184) (runs: 256, μ: 1701, ~: 408)
FixedPointMathLibTest:testLambertW0WadKnownValues() (gas: 1699615)
FixedPointMathLibTest:testLambertW0WadMonoDebug() (gas: 784043)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing() (gas: 18645707)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing(int256,int256) (runs: 256, μ: 7107, ~: 6897)
FixedPointMathLibTest:testLambertW0WadMonoDebug() (gas: 784065)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing() (gas: 18645662)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing(int256,int256) (runs: 256, μ: 7194, ~: 7067)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing2() (gas: 4094486)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround(int256) (runs: 256, μ: 26588, ~: 17576)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround2(uint96) (runs: 256, μ: 41313, ~: 17702)
FixedPointMathLibTest:testLambertW0WadRevertsForOutOfDomain() (gas: 16546)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround(int256) (runs: 256, μ: 26742, ~: 17576)
FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround2(uint96) (runs: 256, μ: 41658, ~: 17636)
FixedPointMathLibTest:testLambertW0WadRevertsForOutOfDomain() (gas: 16568)
FixedPointMathLibTest:testLambertW0WadWithinBounds() (gas: 124321)
FixedPointMathLibTest:testLambertW0WadWithinBounds(int256) (runs: 256, μ: 3278, ~: 4792)
FixedPointMathLibTest:testLnWad() (gas: 2145)
FixedPointMathLibTest:testLambertW0WadWithinBounds(int256) (runs: 256, μ: 3300, ~: 4835)
FixedPointMathLibTest:testLnWad() (gas: 2167)
FixedPointMathLibTest:testLnWadBig() (gas: 2178)
FixedPointMathLibTest:testLnWadNegativeReverts() (gas: 3198)
FixedPointMathLibTest:testLnWadOverflowReverts() (gas: 3173)
FixedPointMathLibTest:testLnWadSmall() (gas: 2758)
FixedPointMathLibTest:testLog10() (gas: 76167)
FixedPointMathLibTest:testLnWadDifferential(int256) (runs: 256, μ: 9228, ~: 1657)
FixedPointMathLibTest:testLnWadNegativeReverts() (gas: 3220)
FixedPointMathLibTest:testLnWadOverflowReverts() (gas: 3195)
FixedPointMathLibTest:testLnWadSmall() (gas: 2780)
FixedPointMathLibTest:testLog10() (gas: 76189)
FixedPointMathLibTest:testLog10(uint256,uint256) (runs: 256, μ: 2153, ~: 2215)
FixedPointMathLibTest:testLog10Up() (gas: 4413)
FixedPointMathLibTest:testLog10Up() (gas: 4435)
FixedPointMathLibTest:testLog2() (gas: 243209)
FixedPointMathLibTest:testLog256() (gas: 22853)
FixedPointMathLibTest:testLog256(uint256,uint256) (runs: 256, μ: 2029, ~: 2129)
FixedPointMathLibTest:testLog256Up() (gas: 1249)
FixedPointMathLibTest:testLog2Differential(uint256) (runs: 256, μ: 870, ~: 864)
FixedPointMathLibTest:testLog2Up() (gas: 297368)
FixedPointMathLibTest:testMax(uint256,uint256) (runs: 256, μ: 518, ~: 523)
FixedPointMathLibTest:testLog256() (gas: 22786)
FixedPointMathLibTest:testLog256(uint256,uint256) (runs: 256, μ: 2038, ~: 2096)
FixedPointMathLibTest:testLog256Up() (gas: 1271)
FixedPointMathLibTest:testLog2Differential(uint256) (runs: 256, μ: 892, ~: 886)
FixedPointMathLibTest:testLog2Up() (gas: 297302)
FixedPointMathLibTest:testMax(uint256,uint256) (runs: 256, μ: 540, ~: 545)
FixedPointMathLibTest:testMaxCasted(uint32,uint32,uint256) (runs: 256, μ: 886, ~: 882)
FixedPointMathLibTest:testMaxSigned(int256,int256) (runs: 256, μ: 542, ~: 547)
FixedPointMathLibTest:testMin(uint256,uint256) (runs: 256, μ: 499, ~: 504)
FixedPointMathLibTest:testMin(uint256,uint256) (runs: 256, μ: 498, ~: 494)
FixedPointMathLibTest:testMinBrutalized(uint256,uint256) (runs: 256, μ: 829, ~: 839)
FixedPointMathLibTest:testMinSigned(int256,int256) (runs: 256, μ: 474, ~: 470)
FixedPointMathLibTest:testMulDiv() (gas: 1890)
FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 256, μ: 693, ~: 794)
FixedPointMathLibTest:testMulDivEdgeCases() (gas: 718)
FixedPointMathLibTest:testMulDiv() (gas: 1845)
FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 256, μ: 718, ~: 816)
FixedPointMathLibTest:testMulDivEdgeCases() (gas: 740)
FixedPointMathLibTest:testMulDivOverflowReverts(uint256,uint256,uint256) (runs: 256, μ: 3854, ~: 3854)
FixedPointMathLibTest:testMulDivUp() (gas: 2103)
FixedPointMathLibTest:testMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 902, ~: 1121)
FixedPointMathLibTest:testMulDivUpEdgeCases() (gas: 839)
FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 256, μ: 3877, ~: 3877)
FixedPointMathLibTest:testMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 909, ~: 1121)
FixedPointMathLibTest:testMulDivUpEdgeCases() (gas: 861)
FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 256, μ: 3899, ~: 3899)
FixedPointMathLibTest:testMulDivUpZeroDenominator() (gas: 3253)
FixedPointMathLibTest:testMulDivUpZeroDenominatorReverts(uint256,uint256) (runs: 256, μ: 3310, ~: 3310)
FixedPointMathLibTest:testMulDivUpZeroDenominatorReverts(uint256,uint256) (runs: 256, μ: 3332, ~: 3332)
FixedPointMathLibTest:testMulDivZeroDenominatorReverts() (gas: 3252)
FixedPointMathLibTest:testMulDivZeroDenominatorReverts(uint256,uint256) (runs: 256, μ: 3377, ~: 3377)
FixedPointMathLibTest:testMulWad() (gas: 714)
FixedPointMathLibTest:testMulWad(uint256,uint256) (runs: 256, μ: 719, ~: 854)
FixedPointMathLibTest:testMulWadEdgeCases() (gas: 692)
FixedPointMathLibTest:testMulWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3832, ~: 3832)
FixedPointMathLibTest:testMulWadUp() (gas: 815)
FixedPointMathLibTest:testMulWadUp(uint256,uint256) (runs: 256, μ: 848, ~: 1065)
FixedPointMathLibTest:testMulWadUpEdgeCases() (gas: 793)
FixedPointMathLibTest:testMulWad() (gas: 736)
FixedPointMathLibTest:testMulWad(uint256,uint256) (runs: 256, μ: 723, ~: 854)
FixedPointMathLibTest:testMulWadEdgeCases() (gas: 714)
FixedPointMathLibTest:testMulWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3769, ~: 3769)
FixedPointMathLibTest:testMulWadUp() (gas: 837)
FixedPointMathLibTest:testMulWadUp(uint256,uint256) (runs: 256, μ: 855, ~: 1065)
FixedPointMathLibTest:testMulWadUpEdgeCases() (gas: 815)
FixedPointMathLibTest:testMulWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3769, ~: 3769)
FixedPointMathLibTest:testPackUnpackSci() (gas: 129349)
FixedPointMathLibTest:testPackUnpackSci(uint256) (runs: 256, μ: 30131, ~: 30088)
FixedPointMathLibTest:testRPow() (gas: 3276)
FixedPointMathLibTest:testPackUnpackSci(uint256) (runs: 256, μ: 30159, ~: 30110)
FixedPointMathLibTest:testRPow() (gas: 3298)
FixedPointMathLibTest:testRPowOverflowReverts() (gas: 4973)
FixedPointMathLibTest:testRawAdd(int256,int256) (runs: 256, μ: 484, ~: 484)
FixedPointMathLibTest:testRawAdd(uint256,uint256) (runs: 256, μ: 485, ~: 485)
FixedPointMathLibTest:testRawAddMod(uint256,uint256,uint256) (runs: 256, μ: 577, ~: 577)
FixedPointMathLibTest:testRawDiv(uint256,uint256) (runs: 256, μ: 465, ~: 465)
FixedPointMathLibTest:testRawMod(uint256,uint256) (runs: 256, μ: 486, ~: 486)
FixedPointMathLibTest:testRawAddMod(uint256,uint256,uint256) (runs: 256, μ: 512, ~: 512)
FixedPointMathLibTest:testRawDiv(uint256,uint256) (runs: 256, μ: 487, ~: 487)
FixedPointMathLibTest:testRawMod(uint256,uint256) (runs: 256, μ: 422, ~: 422)
FixedPointMathLibTest:testRawMul(int256,int256) (runs: 256, μ: 412, ~: 412)
FixedPointMathLibTest:testRawMul(uint256,uint256) (runs: 256, μ: 442, ~: 442)
FixedPointMathLibTest:testRawMulMod(uint256,uint256,uint256) (runs: 256, μ: 512, ~: 512)
FixedPointMathLibTest:testRawSDiv(int256,int256) (runs: 256, μ: 487, ~: 487)
FixedPointMathLibTest:testRawSDiv(int256,int256) (runs: 256, μ: 420, ~: 420)
FixedPointMathLibTest:testRawSMod(int256,int256) (runs: 256, μ: 422, ~: 422)
FixedPointMathLibTest:testRawSub(int256,int256) (runs: 256, μ: 463, ~: 463)
FixedPointMathLibTest:testRawSub(int256,int256) (runs: 256, μ: 485, ~: 485)
FixedPointMathLibTest:testRawSub(uint256,uint256) (runs: 256, μ: 440, ~: 440)
FixedPointMathLibTest:testSci() (gas: 1838613)
FixedPointMathLibTest:testSci(uint256) (runs: 256, μ: 32013, ~: 37538)
FixedPointMathLibTest:testSci2(uint256) (runs: 256, μ: 901, ~: 911)
FixedPointMathLibTest:testSqrt() (gas: 42576)
FixedPointMathLibTest:testSci() (gas: 1838635)
FixedPointMathLibTest:testSci(uint256) (runs: 256, μ: 31445, ~: 35504)
FixedPointMathLibTest:testSci2(uint256) (runs: 256, μ: 924, ~: 933)
FixedPointMathLibTest:testSqrt() (gas: 42598)
FixedPointMathLibTest:testSqrt(uint256) (runs: 256, μ: 1037, ~: 1086)
FixedPointMathLibTest:testSqrtBack(uint256) (runs: 256, μ: 13656, ~: 363)
FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 256, μ: 53160, ~: 53549)
FixedPointMathLibTest:testSqrtHashedSingle() (gas: 53041)
FixedPointMathLibTest:testSqrtWad() (gas: 7470)
FixedPointMathLibTest:testSqrtBack(uint256) (runs: 256, μ: 14014, ~: 385)
FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 256, μ: 53169, ~: 53571)
FixedPointMathLibTest:testSqrtHashedSingle() (gas: 53063)
FixedPointMathLibTest:testSqrtWad() (gas: 7403)
FixedPointMathLibTest:testSqrtWad(uint256) (runs: 256, μ: 1493, ~: 1498)
FixedPointMathLibTest:testZZZ() (gas: 2731)
FixedPointMathLibTest:testZeroFloorSub(uint256,uint256) (runs: 256, μ: 503, ~: 473)
FixedPointMathLibTest:testZeroFloorSubCasted(uint32,uint32,uint256) (runs: 256, μ: 927, ~: 967)
FixedPointMathLibTest:test__codesize() (gas: 39881)
FixedPointMathLibTest:testZZZ() (gas: 2753)
FixedPointMathLibTest:testZeroFloorSub(uint256,uint256) (runs: 256, μ: 502, ~: 473)
FixedPointMathLibTest:testZeroFloorSubCasted(uint32,uint32,uint256) (runs: 256, μ: 863, ~: 900)
FixedPointMathLibTest:test__codesize() (gas: 40758)
GasBurnerLibTest:testBurnGas() (gas: 1700805)
GasBurnerLibTest:test__codesize() (gas: 1435)
JSONParserLibTest:testDecodeEncodedStringDoesNotRevert(string) (runs: 256, μ: 58291, ~: 57099)
Expand Down
92 changes: 92 additions & 0 deletions test/FixedPointMathLib.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,45 @@ contract FixedPointMathLibTest is SoladyTest {
// Relative error: 5.653904247484822e-21
}

function testExpWadDifferential(int256 x) public {
while (x < -42139678854452767551 - 2 || x >= 135305999368893231589) {
x = int256(_bound(_random(), 0, 135305999368893231589));
}
assertEq(FixedPointMathLib.expWad(x), _expWadOriginal(x));
}

// From: https://github.com/transmissions11/solmate/blob/main/src/utils/SignedWadMath.sol
function _expWadOriginal(int256 x) internal pure returns (int256 r) {
unchecked {
if (x <= -42139678854452767551) return 0;
if (x >= 135305999368893231589) revert("EXP_OVERFLOW");

x = (x << 78) / 5 ** 18;
int256 k = ((x << 96) / 54916777467707473351141471128 + 2 ** 95) >> 96;
x = x - k * 54916777467707473351141471128;

int256 y = x + 1346386616545796478920950773328;
y = ((y * x) >> 96) + 57155421227552351082224309758442;
int256 p = y + x - 94201549194550492254356042504812;
p = ((p * y) >> 96) + 28719021644029726153956944680412240;
p = p * x + (4385272521454847904659076985693276 << 96);

int256 q = x - 2855989394907223263936484059900;
q = ((q * x) >> 96) + 50020603652535783019961831881945;
q = ((q * x) >> 96) - 533845033583426703283633433725380;
q = ((q * x) >> 96) + 3604857256930695427073651918091429;
q = ((q * x) >> 96) - 14423608567350463180887372962807573;
q = ((q * x) >> 96) + 26449188498355588339934803723976023;
/// @solidity memory-safe-assembly
assembly {
r := sdiv(p, q)
}
r = int256(
(uint256(r) * 3822833074963236453042738258902158003155416615667) >> uint256(195 - k)
);
}
}

// Notes on lambertW0Wad:
//
// If you want to attempt finding a better approximation, look at
Expand Down Expand Up @@ -760,6 +799,59 @@ contract FixedPointMathLibTest is SoladyTest {
FixedPointMathLib.lnWad(0);
}

function testLnWadDifferential(int256 x) public {
while (x <= 0) x = int256(_random());
assertEq(FixedPointMathLib.lnWad(x), _lnWadOriginal(x));
}

// From: https://github.com/transmissions11/solmate/blob/main/src/utils/SignedWadMath.sol
function _lnWadOriginal(int256 x) internal pure returns (int256 r) {
unchecked {
require(x > 0, "UNDEFINED");

/// @solidity memory-safe-assembly
assembly {
r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))
r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))
r := or(r, shl(5, lt(0xffffffff, shr(r, x))))
r := or(r, shl(4, lt(0xffff, shr(r, x))))
r := or(r, shl(3, lt(0xff, shr(r, x))))
r := or(r, shl(2, lt(0xf, shr(r, x))))
r := or(r, shl(1, lt(0x3, shr(r, x))))
r := or(r, lt(0x1, shr(r, x)))
}

int256 k = r - 96;
x <<= uint256(159 - k);
x = int256(uint256(x) >> 159);

int256 p = x + 3273285459638523848632254066296;
p = ((p * x) >> 96) + 24828157081833163892658089445524;
p = ((p * x) >> 96) + 43456485725739037958740375743393;
p = ((p * x) >> 96) - 11111509109440967052023855526967;
p = ((p * x) >> 96) - 45023709667254063763336534515857;
p = ((p * x) >> 96) - 14706773417378608786704636184526;
p = p * x - (795164235651350426258249787498 << 96);

int256 q = x + 5573035233440673466300451813936;
q = ((q * x) >> 96) + 71694874799317883764090561454958;
q = ((q * x) >> 96) + 283447036172924575727196451306956;
q = ((q * x) >> 96) + 401686690394027663651624208769553;
q = ((q * x) >> 96) + 204048457590392012362485061816622;
q = ((q * x) >> 96) + 31853899698501571402653359427138;
q = ((q * x) >> 96) + 909429971244387300277376558375;
/// @solidity memory-safe-assembly
assembly {
r := sdiv(p, q)
}

r *= 1677202110996718588342820967067443963516166;
r += 16597577552685614221487285958193947469193820559219878177908093499208371 * k;
r += 600920179829731861736702779321621459595472258049074101567377883020018308;
r >>= 174;
}
}

function testRPow() public {
assertEq(FixedPointMathLib.rpow(0, 0, 0), 0);
assertEq(FixedPointMathLib.rpow(1, 0, 0), 0);
Expand Down

0 comments on commit 90f623f

Please sign in to comment.