Skip to content

Universal v4.9.0

Choose a tag to compare

@github-actions github-actions released this 21 Aug 00:18
· 38 commits to main since this release
a10759c

[4.9.0] - 2026-08-20

Behaviour change: elreal<double> results are not bit-identical to v4.8.9

elreal's precision ceiling is gone, and that includes double. It had been
stopping at 307 decimal digits, which is exactly its smallest normal 2^-1022;
it now refines past that wall. Overlapping digits are unchanged in meaning -- the
value simply carries further -- but anyone pinning elreal<double> output will
see a difference
.

Measured against an independently generated 3000-digit reference,
elreal<double> now reaches 1598 digits at depth 96 and is linear at 16.0
digits/block with no ceiling in sight.

host k before after
double 53 307 (its own exponent wall) 1598 at depth 96, still linear
float 24 37 (hard cap) 319
bfloat16 7 33 (hard cap) 146 and climbing

The ceiling was never a precision limit -- it was the host's exponent range, with
blocks carrying their scale in the host significand instead of in the wide
integer<256> exponent the design provides. The fix is one rule at three EFT
sites (normalise operands, not results) plus a nonadjacent k+1 shortcut in
twoSumRN that preserves its round-to-nearest contract and bounds every
alignment shift.

Known limitations

  • half (cfloat<16,5>) as an elreal host is still capped at 20 digits
    (#1363). Its presumed
    blocker, the division refinement floor, is now gone and it remains capped, so
    the cause is something else.
  • agreed_decimal_digits may credit reach over content on sparse narrow-host
    expansions
    -- resolved, and the caveat was wrong
    (#1364). The reported
    digits are correct: depth-32 expansions were rebuilt in exact rational
    arithmetic outside the library and matched their claims exactly (bfloat16 78,
    half 122, float 263). Wide gaps between block exponents appear on every host,
    double included, and blocks * k is not a bound on agreement because an
    expansion is a signed sum -- a negative component borrows from a higher one --
    so the exponents carry information too. Take the reported figures at face
    value.

Added

  • elreal: Cancellation-stressed accumulation benchmarks and oracle (#1353) by @Ravenwater
  • elreal: Exact geometric predicate suite (orient2d / incircle) (#1354) by @Ravenwater
  • elreal: Precision-to-latency matrix for the block-shape study (#1356) by @Ravenwater
  • tools: Sweep the adaptive characterization over host FpType (#1357) by @Ravenwater
  • elreal: Lift the narrow-host ceiling -- float 37 -> 319 digits (#1361) by @Ravenwater

Documentation

  • elreal: Re-validate the Phase 9 block-shape study against current main (#1352) by @Ravenwater

Fixed

  • elreal: Keep bfloat16's two_prod in host arithmetic (#1358) by @Ravenwater
  • bfloat16: Report the true scale of subnormals (#1359) by @Ravenwater
  • elreal: Normalise every host -- double was sitting on its own wall (#1362) by @Ravenwater
  • elreal: Bound el_api_math's constants -- UBSan timeout on main (#1365) by @Ravenwater