mirror of
https://github.com/XRPLF/rippled.git
synced 2026-06-04 17:27:00 +00:00
IOUAmount::normalize() previously built a Number (one normalize pass to the default Large range) and then re-normalized down to the narrower IOU range via fromNumber (a second pass) -- two full passes where one would do. Add a static Number::normalizeToRange<Min,Max>(mantissa, exponent) that normalizes raw integers straight to a target range in a single pass, building no intermediate Number. Refactor the existing const member overload to share one implementation, so both paths have a single source of truth. Rewire the getSTNumberSwitchover()-true branch of IOUAmount::normalize() to call the new primitive. The result is bit-identical to the old two-pass path: an intermediate pass to a strictly wider range cannot change the final narrower-range result. Equivalence is proven by new GTests that sweep mantissa/exponent boundaries, negatives, int64 extremes, rounding cusps, and all four rounding modes against the prior two-pass result, plus exact-value assertions on hand-computed cases. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>