From 84796a0117689f74c1d153c7a21a20d3291a6c6b Mon Sep 17 00:00:00 2001 From: engn33r Date: Thu, 14 Dec 2023 00:00:00 +0000 Subject: [PATCH] optimize zero point in expWad --- .gas-snapshot | 54 ++++++++++++++++----------------- src/utils/FixedPointMathLib.sol | 2 +- test/FixedPointMathLib.t.sol | 3 +- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 9ab231a6fd..5fe7ebbfbc 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -373,48 +373,48 @@ FixedPointMathLibTest:testAvgEdgeCase() (gas: 425) FixedPointMathLibTest:testAvgSigned() (gas: 897) FixedPointMathLibTest:testCbrt() (gas: 10261) FixedPointMathLibTest:testCbrt(uint256) (runs: 256, μ: 1424, ~: 1513) -FixedPointMathLibTest:testCbrtBack(uint256) (runs: 256, μ: 31364, ~: 39721) +FixedPointMathLibTest:testCbrtBack(uint256) (runs: 256, μ: 30635, ~: 33622) FixedPointMathLibTest:testCbrtWad() (gas: 12006) -FixedPointMathLibTest:testCbrtWad(uint256) (runs: 256, μ: 1996, ~: 2005) +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:testDist(int256,int256) (runs: 256, μ: 540, ~: 536) FixedPointMathLibTest:testDistEdgeCases() (gas: 505) FixedPointMathLibTest:testDivWad() (gas: 702) -FixedPointMathLibTest:testDivWad(uint256,uint256) (runs: 256, μ: 798, ~: 913) +FixedPointMathLibTest:testDivWad(uint256,uint256) (runs: 256, μ: 799, ~: 913) FixedPointMathLibTest:testDivWadEdgeCases() (gas: 458) FixedPointMathLibTest:testDivWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3749, ~: 3749) FixedPointMathLibTest:testDivWadUp() (gas: 3084) -FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 256, μ: 793, ~: 942) +FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 256, μ: 795, ~: 942) FixedPointMathLibTest:testDivWadUpEdgeCases() (gas: 483) FixedPointMathLibTest:testDivWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3748, ~: 3748) FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts() (gas: 3239) FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts(uint256) (runs: 256, μ: 3295, ~: 3295) FixedPointMathLibTest:testDivWadZeroDenominatorReverts() (gas: 3240) FixedPointMathLibTest:testDivWadZeroDenominatorReverts(uint256) (runs: 256, μ: 3315, ~: 3315) -FixedPointMathLibTest:testExpWad() (gas: 7544) +FixedPointMathLibTest:testExpWad() (gas: 8024) FixedPointMathLibTest:testFactorial() (gas: 98825) FixedPointMathLibTest:testFactorialOriginal() (gas: 94187) FixedPointMathLibTest:testFullMulDiv() (gas: 1184) -FixedPointMathLibTest:testFullMulDiv(uint256,uint256,uint256) (runs: 256, μ: 1374, ~: 988) -FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 1738, ~: 1523) +FixedPointMathLibTest:testFullMulDiv(uint256,uint256,uint256) (runs: 256, μ: 1393, ~: 988) +FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 1745, ~: 1523) FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase1() (gas: 3677) FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase2() (gas: 3688) FixedPointMathLibTest:testGcd() (gas: 4206) -FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 256, μ: 5031, ~: 2223) +FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 256, μ: 5211, ~: 2408) FixedPointMathLibTest:testLambertW0WadAccuracy() (gas: 7170) -FixedPointMathLibTest:testLambertW0WadAccuracy(uint184) (runs: 256, μ: 1719, ~: 386) +FixedPointMathLibTest:testLambertW0WadAccuracy(uint184) (runs: 256, μ: 1656, ~: 386) FixedPointMathLibTest:testLambertW0WadKnownValues() (gas: 1689686) FixedPointMathLibTest:testLambertW0WadMonoDebug() (gas: 772665) FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing() (gas: 18485606) -FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing(int256,int256) (runs: 256, μ: 7077, ~: 6969) +FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing(int256,int256) (runs: 256, μ: 6965, ~: 6836) FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing2() (gas: 4045100) -FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround(int256) (runs: 256, μ: 26704, ~: 17568) -FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround2(uint96) (runs: 256, μ: 41253, ~: 17628) +FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround(int256) (runs: 256, μ: 26596, ~: 17568) +FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround2(uint96) (runs: 256, μ: 40662, ~: 17332) FixedPointMathLibTest:testLambertW0WadRevertsForOutOfDomain() (gas: 16567) FixedPointMathLibTest:testLambertW0WadWithinBounds() (gas: 122497) -FixedPointMathLibTest:testLambertW0WadWithinBounds(int256) (runs: 256, μ: 3040, ~: 1273) +FixedPointMathLibTest:testLambertW0WadWithinBounds(int256) (runs: 256, μ: 3143, ~: 2628) FixedPointMathLibTest:testLnWad() (gas: 2098) FixedPointMathLibTest:testLnWadBig() (gas: 2109) FixedPointMathLibTest:testLnWadNegativeReverts() (gas: 3318) @@ -425,22 +425,22 @@ FixedPointMathLibTest:testLog10(uint256,uint256) (runs: 256, μ: 2171, ~: 2237) FixedPointMathLibTest:testLog10Up() (gas: 4413) FixedPointMathLibTest:testLog2() (gas: 243209) FixedPointMathLibTest:testLog256() (gas: 22786) -FixedPointMathLibTest:testLog256(uint256,uint256) (runs: 256, μ: 2016, ~: 2082) +FixedPointMathLibTest:testLog256(uint256,uint256) (runs: 256, μ: 2027, ~: 2091) FixedPointMathLibTest:testLog256Up() (gas: 1249) FixedPointMathLibTest:testLog2Differential(uint256) (runs: 256, μ: 870, ~: 864) FixedPointMathLibTest:testLog2Up() (gas: 297368) -FixedPointMathLibTest:testMax(uint256,uint256) (runs: 256, μ: 517, ~: 513) -FixedPointMathLibTest:testMaxCasted(uint32,uint32,uint256) (runs: 256, μ: 886, ~: 882) +FixedPointMathLibTest:testMax(uint256,uint256) (runs: 256, μ: 518, ~: 523) +FixedPointMathLibTest:testMaxCasted(uint32,uint32,uint256) (runs: 256, μ: 887, ~: 892) FixedPointMathLibTest:testMaxSigned(int256,int256) (runs: 256, μ: 476, ~: 481) FixedPointMathLibTest:testMin(uint256,uint256) (runs: 256, μ: 499, ~: 504) FixedPointMathLibTest:testMinBrutalized(uint256,uint256) (runs: 256, μ: 830, ~: 839) FixedPointMathLibTest:testMinSigned(int256,int256) (runs: 256, μ: 474, ~: 470) FixedPointMathLibTest:testMulDiv() (gas: 1890) -FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 256, μ: 717, ~: 816) +FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 256, μ: 716, ~: 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, μ: 906, ~: 1121) +FixedPointMathLibTest:testMulDivUp(uint256,uint256,uint256) (runs: 256, μ: 904, ~: 1121) FixedPointMathLibTest:testMulDivUpEdgeCases() (gas: 861) FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 256, μ: 3877, ~: 3877) FixedPointMathLibTest:testMulDivUpZeroDenominator() (gas: 3253) @@ -448,15 +448,15 @@ FixedPointMathLibTest:testMulDivUpZeroDenominatorReverts(uint256,uint256) (runs: FixedPointMathLibTest:testMulDivZeroDenominatorReverts() (gas: 3252) FixedPointMathLibTest:testMulDivZeroDenominatorReverts(uint256,uint256) (runs: 256, μ: 3310, ~: 3310) FixedPointMathLibTest:testMulWad() (gas: 714) -FixedPointMathLibTest:testMulWad(uint256,uint256) (runs: 256, μ: 720, ~: 854) +FixedPointMathLibTest:testMulWad(uint256,uint256) (runs: 256, μ: 723, ~: 854) FixedPointMathLibTest:testMulWadEdgeCases() (gas: 692) FixedPointMathLibTest:testMulWadOverflowReverts(uint256,uint256) (runs: 256, μ: 3832, ~: 3832) FixedPointMathLibTest:testMulWadUp() (gas: 815) -FixedPointMathLibTest:testMulWadUp(uint256,uint256) (runs: 256, μ: 851, ~: 1065) +FixedPointMathLibTest:testMulWadUp(uint256,uint256) (runs: 256, μ: 855, ~: 1065) FixedPointMathLibTest:testMulWadUpEdgeCases() (gas: 793) FixedPointMathLibTest:testMulWadUpOverflowReverts(uint256,uint256) (runs: 256, μ: 3769, ~: 3769) FixedPointMathLibTest:testPackUnpackSci() (gas: 129349) -FixedPointMathLibTest:testPackUnpackSci(uint256) (runs: 256, μ: 30147, ~: 30088) +FixedPointMathLibTest:testPackUnpackSci(uint256) (runs: 256, μ: 30149, ~: 30088) FixedPointMathLibTest:testRPow() (gas: 3276) FixedPointMathLibTest:testRPowOverflowReverts() (gas: 4973) FixedPointMathLibTest:testRawAdd(int256,int256) (runs: 256, μ: 484, ~: 484) @@ -472,18 +472,18 @@ FixedPointMathLibTest:testRawSMod(int256,int256) (runs: 256, μ: 422, ~: 422) FixedPointMathLibTest:testRawSub(int256,int256) (runs: 256, μ: 485, ~: 485) FixedPointMathLibTest:testRawSub(uint256,uint256) (runs: 256, μ: 440, ~: 440) FixedPointMathLibTest:testSci() (gas: 1838635) -FixedPointMathLibTest:testSci(uint256) (runs: 256, μ: 31825, ~: 37538) +FixedPointMathLibTest:testSci(uint256) (runs: 256, μ: 31423, ~: 33716) FixedPointMathLibTest:testSci2(uint256) (runs: 256, μ: 901, ~: 911) FixedPointMathLibTest:testSqrt() (gas: 42576) FixedPointMathLibTest:testSqrt(uint256) (runs: 256, μ: 1037, ~: 1086) -FixedPointMathLibTest:testSqrtBack(uint256) (runs: 256, μ: 14111, ~: 385) -FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 256, μ: 53198, ~: 53549) +FixedPointMathLibTest:testSqrtBack(uint256) (runs: 256, μ: 13888, ~: 385) +FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 256, μ: 53160, ~: 53549) FixedPointMathLibTest:testSqrtHashedSingle() (gas: 53041) FixedPointMathLibTest:testSqrtWad() (gas: 7470) FixedPointMathLibTest:testSqrtWad(uint256) (runs: 256, μ: 1493, ~: 1498) -FixedPointMathLibTest:testZeroFloorSub(uint256,uint256) (runs: 256, μ: 503, ~: 534) -FixedPointMathLibTest:testZeroFloorSubCasted(uint32,uint32,uint256) (runs: 256, μ: 928, ~: 967) -FixedPointMathLibTest:test__codesize() (gas: 39705) +FixedPointMathLibTest:testZeroFloorSub(uint256,uint256) (runs: 256, μ: 502, ~: 473) +FixedPointMathLibTest:testZeroFloorSubCasted(uint32,uint32,uint256) (runs: 256, μ: 924, ~: 886) +FixedPointMathLibTest:test__codesize() (gas: 39734) GasBurnerLibTest:testBurnGas() (gas: 1700805) GasBurnerLibTest:test__codesize() (gas: 1435) JSONParserLibTest:testDecodeEncodedStringDoesNotRevert(string) (runs: 256, μ: 58291, ~: 57099) diff --git a/src/utils/FixedPointMathLib.sol b/src/utils/FixedPointMathLib.sol index a23ca7c96a..e878bcfd90 100644 --- a/src/utils/FixedPointMathLib.sol +++ b/src/utils/FixedPointMathLib.sol @@ -153,7 +153,7 @@ library FixedPointMathLib { unchecked { // When the result is less than 0.5 we return zero. // This happens when `x <= floor(log(0.5e18) * 1e18) ≈ -42e18`. - if (x <= -42139678854452767551) return r; + if (x <= -41446531673892822313) return r; /// @solidity memory-safe-assembly assembly { diff --git a/test/FixedPointMathLib.t.sol b/test/FixedPointMathLib.t.sol index 7e26892676..421864f90f 100644 --- a/test/FixedPointMathLib.t.sol +++ b/test/FixedPointMathLib.t.sol @@ -6,7 +6,8 @@ import {FixedPointMathLib} from "../src/utils/FixedPointMathLib.sol"; contract FixedPointMathLibTest is SoladyTest { function testExpWad() public { - assertEq(FixedPointMathLib.expWad(-42139678854452767551), 0); + assertEq(FixedPointMathLib.expWad(-41446531673892822312), 1); + assertEq(FixedPointMathLib.expWad(-41446531673892822313), 0); assertEq(FixedPointMathLib.expWad(-3e18), 49787068367863942); assertEq(FixedPointMathLib.expWad(-2e18), 135335283236612691);