diff --git a/src/lib/LibDecimalFloat.sol b/src/lib/LibDecimalFloat.sol index 0f4ff635..24558393 100644 --- a/src/lib/LibDecimalFloat.sol +++ b/src/lib/LibDecimalFloat.sol @@ -1176,4 +1176,14 @@ library LibDecimalFloat { (result.signedCoefficient, result.exponent) = max(a.signedCoefficient, a.exponent, b.signedCoefficient, b.exponent); } + + /// Same as normalize, but accepts a Float struct instead of separate values. + /// Costs more gas but helps mitigate stack depth issues, and is more + /// ergonomic for the caller. + /// @param float The Float struct containing the signed coefficient and + /// exponent of the floating point number. + function normalize(Float memory float) internal pure returns (Float memory result) { + (result.signedCoefficient, result.exponent) = + LibDecimalFloatImplementation.normalize(float.signedCoefficient, float.exponent); + } } diff --git a/test/src/lib/LibDecimalFloat.normalize.t.sol b/test/src/lib/LibDecimalFloat.normalize.t.sol new file mode 100644 index 00000000..aa2bf10e --- /dev/null +++ b/test/src/lib/LibDecimalFloat.normalize.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: CAL +pragma solidity =0.8.25; + +import {LibDecimalFloat, Float} from "src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloatImplementation} from "src/lib/implementation/LibDecimalFloatImplementation.sol"; +import {Test} from "forge-std/Test.sol"; + +contract LibDecimalFloatNormalizeTest is Test { + using LibDecimalFloat for Float; + + function normalizeExternal(int256 signedCoefficient, int256 exponent) external pure returns (int256, int256) { + return LibDecimalFloatImplementation.normalize(signedCoefficient, exponent); + } + + function normalizeExternal(Float memory float) external pure returns (Float memory) { + return LibDecimalFloat.normalize(float); + } + /// Stack and mem are the same. + + function testNormalizeMem(Float memory float) external { + try this.normalizeExternal(float.signedCoefficient, float.exponent) returns ( + int256 signedCoefficient, int256 exponent + ) { + Float memory floatNormalized = this.normalizeExternal(float); + assertEq(signedCoefficient, floatNormalized.signedCoefficient); + assertEq(exponent, floatNormalized.exponent); + } catch (bytes memory err) { + vm.expectRevert(err); + this.normalizeExternal(float); + } + } +} diff --git a/test/src/lib/LibDecimalFloat.pack.t.sol b/test/src/lib/LibDecimalFloat.pack.t.sol index 33d56d8e..47da73ac 100644 --- a/test/src/lib/LibDecimalFloat.pack.t.sol +++ b/test/src/lib/LibDecimalFloat.pack.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: CAL -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import { LibDecimalFloat,