diff --git a/.gas-snapshot b/.gas-snapshot index bf08591..3b6021b 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,36 +1,36 @@ -DecimalFloatAbsTest:testAbsDeployed(bytes32) (runs: 5096, μ: 3602249, ~: 3602188) -DecimalFloatAddTest:testAddDeployed(bytes32,bytes32) (runs: 5096, μ: 3607708, ~: 3607769) -DecimalFloatCeilTest:testCeilDeployed(bytes32) (runs: 5096, μ: 3602256, ~: 3601851) -DecimalFloatConstantsTest:testEDeployed() (gas: 3601381) -DecimalFloatConstantsTest:testMaxNegativeValueDeployed() (gas: 3601370) -DecimalFloatConstantsTest:testMaxPositiveValueDeployed() (gas: 3601371) -DecimalFloatConstantsTest:testMinNegativeValueDeployed() (gas: 3601346) -DecimalFloatConstantsTest:testMinPositiveValueDeployed() (gas: 3601347) -DecimalFloatConstantsTest:testZeroDeployed() (gas: 3601414) -DecimalFloatDivTest:testDivDeployed(bytes32,bytes32) (runs: 5096, μ: 3609317, ~: 3609464) -DecimalFloatEqTest:testEqDeployed(bytes32,bytes32) (runs: 5096, μ: 3602580, ~: 3602506) -DecimalFloatFloorTest:testFloorDeployed(bytes32) (runs: 5096, μ: 3602038, ~: 3601849) -DecimalFloatFormatTest:testFormatDeployed(bytes32,uint256) (runs: 5096, μ: 3627947, ~: 3632554) -DecimalFloatFracTest:testFracDeployed(bytes32) (runs: 5096, μ: 3602436, ~: 3602399) -DecimalFloatFromFixedDecimalLosslessTest:testFromFixedDecimalLosslessDeployed(uint256,uint8) (runs: 5096, μ: 3603018, ~: 3602967) -DecimalFloatFromFixedDecimalLossyTest:testFromFixedDecimalLossyDeployed(uint256,uint8) (runs: 5096, μ: 3603497, ~: 3603434) -DecimalFloatGtTest:testGtDeployed(bytes32,bytes32) (runs: 5096, μ: 3602520, ~: 3602448) -DecimalFloatGteTest:testGteDeployed(bytes32,bytes32) (runs: 5096, μ: 3602509, ~: 3602434) -DecimalFloatInvTest:testInvDeployed(bytes32) (runs: 5096, μ: 3607724, ~: 3607783) -DecimalFloatIsZeroTest:testIsZeroDeployed(bytes32) (runs: 5096, μ: 3601691, ~: 3601691) -DecimalFloatLtTest:testLtDeployed(bytes32,bytes32) (runs: 5096, μ: 3602497, ~: 3602425) -DecimalFloatLteTest:testLteDeployed(bytes32,bytes32) (runs: 5096, μ: 3602553, ~: 3602478) -DecimalFloatMaxTest:testMaxDeployed(bytes32,bytes32) (runs: 5096, μ: 3602560, ~: 3602500) -DecimalFloatMinTest:testMinDeployed(bytes32,bytes32) (runs: 5096, μ: 3602558, ~: 3602498) -DecimalFloatMinusTest:testMinusDeployed(bytes32) (runs: 5096, μ: 3602356, ~: 3602357) -DecimalFloatMulTest:testMulDeployed(bytes32,bytes32) (runs: 5096, μ: 3606276, ~: 3607066) +DecimalFloatAbsTest:testAbsDeployed(bytes32) (runs: 5096, μ: 3622499, ~: 3622438) +DecimalFloatAddTest:testAddDeployed(bytes32,bytes32) (runs: 5096, μ: 3627945, ~: 3628019) +DecimalFloatCeilTest:testCeilDeployed(bytes32) (runs: 5096, μ: 3622503, ~: 3622101) +DecimalFloatConstantsTest:testEDeployed() (gas: 3621631) +DecimalFloatConstantsTest:testMaxNegativeValueDeployed() (gas: 3621620) +DecimalFloatConstantsTest:testMaxPositiveValueDeployed() (gas: 3621621) +DecimalFloatConstantsTest:testMinNegativeValueDeployed() (gas: 3621596) +DecimalFloatConstantsTest:testMinPositiveValueDeployed() (gas: 3621597) +DecimalFloatConstantsTest:testZeroDeployed() (gas: 3621664) +DecimalFloatDivTest:testDivDeployed(bytes32,bytes32) (runs: 5096, μ: 3629575, ~: 3629709) +DecimalFloatEqTest:testEqDeployed(bytes32,bytes32) (runs: 5096, μ: 3622830, ~: 3622756) +DecimalFloatFloorTest:testFloorDeployed(bytes32) (runs: 5096, μ: 3622291, ~: 3622099) +DecimalFloatFormatTest:testFormatDeployed(bytes32,uint256) (runs: 5096, μ: 3648201, ~: 3652804) +DecimalFloatFracTest:testFracDeployed(bytes32) (runs: 5096, μ: 3622685, ~: 3622649) +DecimalFloatFromFixedDecimalLosslessTest:testFromFixedDecimalLosslessDeployed(uint256,uint8) (runs: 5096, μ: 3623268, ~: 3623217) +DecimalFloatFromFixedDecimalLossyTest:testFromFixedDecimalLossyDeployed(uint256,uint8) (runs: 5096, μ: 3623745, ~: 3623684) +DecimalFloatGtTest:testGtDeployed(bytes32,bytes32) (runs: 5096, μ: 3622770, ~: 3622698) +DecimalFloatGteTest:testGteDeployed(bytes32,bytes32) (runs: 5096, μ: 3622761, ~: 3622684) +DecimalFloatInvTest:testInvDeployed(bytes32) (runs: 5096, μ: 3627984, ~: 3628033) +DecimalFloatIsZeroTest:testIsZeroDeployed(bytes32) (runs: 5096, μ: 3621941, ~: 3621941) +DecimalFloatLtTest:testLtDeployed(bytes32,bytes32) (runs: 5096, μ: 3622747, ~: 3622675) +DecimalFloatLteTest:testLteDeployed(bytes32,bytes32) (runs: 5096, μ: 3622804, ~: 3622728) +DecimalFloatMaxTest:testMaxDeployed(bytes32,bytes32) (runs: 5096, μ: 3622813, ~: 3622750) +DecimalFloatMinTest:testMinDeployed(bytes32,bytes32) (runs: 5096, μ: 3622808, ~: 3622748) +DecimalFloatMinusTest:testMinusDeployed(bytes32) (runs: 5096, μ: 3622606, ~: 3622607) +DecimalFloatMulTest:testMulDeployed(bytes32,bytes32) (runs: 5096, μ: 3626529, ~: 3627316) DecimalFloatPackLosslessTest:testPackDeployed(int224,int32) (runs: 5096, μ: 170044, ~: 170045) -DecimalFloatParseTest:testParseDeployed(string) (runs: 5096, μ: 3604930, ~: 3604799) -DecimalFloatPowTest:testPowDeployed(bytes32,bytes32) (runs: 5096, μ: 3655950, ~: 3631589) -DecimalFloatSqrtTest:testSqrtDeployed(bytes32) (runs: 5096, μ: 3618648, ~: 3620391) -DecimalFloatSubTest:testSubDeployed(bytes32,bytes32) (runs: 5096, μ: 3608116, ~: 3608144) -DecimalFloatToFixedDecimalLosslessTest:testToFixedDecimalLosslessDeployed(bytes32,uint8) (runs: 5096, μ: 3603609, ~: 3603530) -DecimalFloatToFixedDecimalLossyTest:testToFixedDecimalLossyDeployed(bytes32,uint8) (runs: 5096, μ: 3603727, ~: 3604014) +DecimalFloatParseTest:testParseDeployed(string) (runs: 5096, μ: 3625179, ~: 3625048) +DecimalFloatPowTest:testPowDeployed(bytes32,bytes32) (runs: 5096, μ: 3675640, ~: 3651855) +DecimalFloatSqrtTest:testSqrtDeployed(bytes32) (runs: 5096, μ: 3639347, ~: 3640641) +DecimalFloatSubTest:testSubDeployed(bytes32,bytes32) (runs: 5096, μ: 3628369, ~: 3628394) +DecimalFloatToFixedDecimalLosslessTest:testToFixedDecimalLosslessDeployed(bytes32,uint8) (runs: 5096, μ: 3623883, ~: 3623780) +DecimalFloatToFixedDecimalLossyTest:testToFixedDecimalLossyDeployed(bytes32,uint8) (runs: 5096, μ: 3623973, ~: 3624264) LibDecimalFloatAbsTest:testAbsMinValue(int32) (runs: 5038, μ: 5162, ~: 5162) LibDecimalFloatAbsTest:testAbsNegative(int256,int32) (runs: 5096, μ: 10536, ~: 10754) LibDecimalFloatAbsTest:testAbsNonNegative(int256,int32) (runs: 5096, μ: 9700, ~: 9316) @@ -181,12 +181,12 @@ LibDecimalFloatImplementationInvTest:testInv0() (gas: 4452) LibDecimalFloatImplementationInvTest:testInvGas0() (gas: 2248) LibDecimalFloatImplementationInvTest:testInvReference(int256,int256) (runs: 5046, μ: 15312, ~: 15362) LibDecimalFloatImplementationInvTest:testInvSlowGas0() (gas: 2560) -LibDecimalFloatImplementationLog10Test:testExactLogs() (gas: 1256416) -LibDecimalFloatImplementationLog10Test:testExactLookupsLog10() (gas: 1303855) -LibDecimalFloatImplementationLog10Test:testInterpolatedLookups() (gas: 1251083) -LibDecimalFloatImplementationLog10Test:testLog10One() (gas: 1484551) -LibDecimalFloatImplementationLog10Test:testSub1() (gas: 1252762) -LibDecimalFloatImplementationLookupLogTableValTest:testLookupLogTableVal() (gas: 1364784) +LibDecimalFloatImplementationLog10Test:testExactLogs() (gas: 1262946) +LibDecimalFloatImplementationLog10Test:testExactLookupsLog10() (gas: 1310385) +LibDecimalFloatImplementationLog10Test:testInterpolatedLookups() (gas: 1257613) +LibDecimalFloatImplementationLog10Test:testLog10One() (gas: 1491086) +LibDecimalFloatImplementationLog10Test:testSub1() (gas: 1259292) +LibDecimalFloatImplementationLookupLogTableValTest:testLookupLogTableVal() (gas: 1371314) LibDecimalFloatImplementationMaximizeTest:testMaximizedEverything(int256,int256) (runs: 5096, μ: 9797, ~: 9799) LibDecimalFloatImplementationMaximizeTest:testMaximizedExamples() (gas: 192873) LibDecimalFloatImplementationMaximizeTest:testMaximizedIdempotent(int256,int256) (runs: 5096, μ: 10342, ~: 10306) @@ -208,11 +208,11 @@ LibDecimalFloatImplementationMulTest:testMulOneZero() (gas: 4481) LibDecimalFloatImplementationMulTest:testMulZero0Exponent() (gas: 4503) LibDecimalFloatImplementationMulTest:testMulZeroAnyExponent(int64,int64) (runs: 5096, μ: 4704, ~: 4704) LibDecimalFloatImplementationMulTest:testMulZeroOne() (gas: 4438) -LibDecimalFloatImplementationPow10Test:testExactLookupsPow10() (gas: 1280808) -LibDecimalFloatImplementationPow10Test:testExactPows() (gas: 1251875) -LibDecimalFloatImplementationPow10Test:testInterpolatedLookupsPower() (gas: 1283443) -LibDecimalFloatImplementationPow10Test:testNoRevert(int224,int32) (runs: 3632, μ: 1249376, ~: 1247204) -LibDecimalFloatImplementationPow10Test:testPow10One() (gas: 1557235) +LibDecimalFloatImplementationPow10Test:testExactLookupsPow10() (gas: 1287338) +LibDecimalFloatImplementationPow10Test:testExactPows() (gas: 1258404) +LibDecimalFloatImplementationPow10Test:testInterpolatedLookupsPower() (gas: 1290143) +LibDecimalFloatImplementationPow10Test:testNoRevert(int224,int32) (runs: 3594, μ: 1255821, ~: 1253779) +LibDecimalFloatImplementationPow10Test:testPow10One() (gas: 1563766) LibDecimalFloatImplementationSubTest:testSubIsAdd(int256,int256,int256,int256) (runs: 5079, μ: 17124, ~: 17237) LibDecimalFloatImplementationSubTest:testSubMinSignedValue(int256,int256,int256) (runs: 5096, μ: 15937, ~: 15910) LibDecimalFloatImplementationSubTest:testSubOneFromMax() (gas: 7308) @@ -242,7 +242,7 @@ LibDecimalFloatIsZeroTest:testIsZeroDeployed(bytes32) (runs: 5096, μ: 3899, ~: LibDecimalFloatIsZeroTest:testIsZeroEqZero(bytes32) (runs: 5096, μ: 3527, ~: 3527) LibDecimalFloatIsZeroTest:testIsZeroExamples(int32) (runs: 5096, μ: 4467, ~: 4467) LibDecimalFloatIsZeroTest:testNotIsZero(int224,int32) (runs: 5039, μ: 3922, ~: 3922) -LibDecimalFloatLog10Test:testLog10Packed(bytes32) (runs: 5096, μ: 1643338, ~: 1265071) +LibDecimalFloatLog10Test:testLog10Packed(bytes32) (runs: 5096, μ: 1652377, ~: 1270929) LibDecimalFloatLtTest:testLtExamples() (gas: 4015) LibDecimalFloatLtTest:testLtGasAZero() (gas: 967) LibDecimalFloatLtTest:testLtGasBZero() (gas: 1033) @@ -289,19 +289,19 @@ LibDecimalFloatPackTest:testPackExponentOverflow(int256,int256) (runs: 5046, μ: LibDecimalFloatPackTest:testPackNegativeExponentLossyZero(int256,int256) (runs: 5046, μ: 11957, ~: 12110) LibDecimalFloatPackTest:testPackZero(int256) (runs: 5096, μ: 4469, ~: 4469) LibDecimalFloatPackTest:testPartsRoundTrip(int224,int32) (runs: 5096, μ: 5484, ~: 5485) -LibDecimalFloatPow10Test:testPow10Packed(bytes32) (runs: 5096, μ: 1630425, ~: 1248021) -LibDecimalFloatPowTest:testNegativePowError(bytes32,bytes32) (runs: 5039, μ: 1235076, ~: 1235194) -LibDecimalFloatPowTest:testPowAZero(int32,bytes32) (runs: 3512, μ: 1234225, ~: 1234225) -LibDecimalFloatPowTest:testPowAZeroNegative(bytes32) (runs: 1609, μ: 1234609, ~: 1234609) -LibDecimalFloatPowTest:testPowBOne(bytes32) (runs: 5072, μ: 1539182, ~: 1539153) -LibDecimalFloatPowTest:testPowBZero(bytes32,int32) (runs: 5096, μ: 1233793, ~: 1233793) -LibDecimalFloatPowTest:testPows() (gas: 1635705) -LibDecimalFloatPowTest:testRoundTripFuzzPow(bytes32,bytes32) (runs: 5096, μ: 1281141, ~: 1255407) -LibDecimalFloatPowTest:testRoundTripSimple() (gas: 1874217) -LibDecimalFloatSqrtTest:testRoundTripFuzzSqrt(int224,int32) (runs: 5096, μ: 1297633, ~: 1300240) -LibDecimalFloatSqrtTest:testSqrt() (gas: 1297587) -LibDecimalFloatSqrtTest:testSqrtNegative(bytes32) (runs: 5078, μ: 1234789, ~: 1234907) -LibDecimalFloatSqrtTest:testSqrtRoundTrip() (gas: 1516148) +LibDecimalFloatPow10Test:testPow10Packed(bytes32) (runs: 5096, μ: 1640522, ~: 1254643) +LibDecimalFloatPowTest:testNegativePowError(bytes32,bytes32) (runs: 5047, μ: 1241606, ~: 1241724) +LibDecimalFloatPowTest:testPowAZero(int32,bytes32) (runs: 3513, μ: 1240754, ~: 1240754) +LibDecimalFloatPowTest:testPowAZeroNegative(bytes32) (runs: 1604, μ: 1241138, ~: 1241138) +LibDecimalFloatPowTest:testPowBOne(bytes32) (runs: 5081, μ: 1545717, ~: 1545688) +LibDecimalFloatPowTest:testPowBZero(bytes32,int32) (runs: 5096, μ: 1240322, ~: 1240322) +LibDecimalFloatPowTest:testPows() (gas: 1672051) +LibDecimalFloatPowTest:testRoundTripFuzzPow(bytes32,bytes32) (runs: 5096, μ: 1286713, ~: 1261888) +LibDecimalFloatPowTest:testRoundTripSimple() (gas: 1881202) +LibDecimalFloatSqrtTest:testRoundTripFuzzSqrt(int224,int32) (runs: 5096, μ: 1305156, ~: 1310935) +LibDecimalFloatSqrtTest:testSqrt() (gas: 1304231) +LibDecimalFloatSqrtTest:testSqrtNegative(bytes32) (runs: 5074, μ: 1241319, ~: 1241437) +LibDecimalFloatSqrtTest:testSqrtRoundTrip() (gas: 1522848) LibDecimalFloatSubTest:testSubPacked(bytes32,bytes32) (runs: 5096, μ: 12228, ~: 12283) LibFormatDecimalFloatCountSigFigs:testCountSigFigsExamples() (gas: 83596) LibFormatDecimalFloatCountSigFigs:testCountSigFigsOne(int256) (runs: 5096, μ: 31877, ~: 31719) diff --git a/src/lib/implementation/LibDecimalFloatImplementation.sol b/src/lib/implementation/LibDecimalFloatImplementation.sol index 0d51ba0..30ea6be 100644 --- a/src/lib/implementation/LibDecimalFloatImplementation.sol +++ b/src/lib/implementation/LibDecimalFloatImplementation.sol @@ -888,6 +888,12 @@ library LibDecimalFloatImplementation { lookupAntilogTableY1Y2(tablesDataContract, uint256(idx), interpolate); } if (interpolate) { + // This case causes an overflow below. + if (idx > 4 && scale == 1e76) { + scale = 1e75; + mantissaCoefficient /= 10; + } + (signedCoefficient, exponent) = unitLinearInterpolation( idx * scale, mantissaCoefficient, (idx + 1) * scale, exponent, y1Coefficient, y2Coefficient, -4 ); diff --git a/test/src/lib/LibDecimalFloat.pow.t.sol b/test/src/lib/LibDecimalFloat.pow.t.sol index 059c239..d0b7266 100644 --- a/test/src/lib/LibDecimalFloat.pow.t.sol +++ b/test/src/lib/LibDecimalFloat.pow.t.sol @@ -69,6 +69,8 @@ contract LibDecimalFloatPowTest is LogTest { (int256 signedCoefficientE, int256 exponentE) = LibDecimalFloat.FLOAT_E.unpack(); checkPow(signedCoefficientE, exponentE, 1, 0, signedCoefficientE, exponentE); } + + checkPow(1.0029e67, -67, 0.41e2, -2, 1.001e3, -3); } /// a^b is error for negative a and all b.