• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

stillwater-sc / universal / 32325826449
85%
master: 84%

Build:
Build:
LAST BUILD BRANCH: main
DEFAULT BRANCH: master
Ran 20 Aug 2026 03:23AM UTC
Jobs 1
Files 620
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

20 Aug 2026 02:46AM UTC coverage: 85.36% (-0.04%) from 85.399%
32325826449

push

github

web-flow
fix(elreal): keep bfloat16's two_prod in host arithmetic (#1358)

* fix(elreal): keep bfloat16's two_prod in host arithmetic

block_eft.hpp opens with a binding rule from epic #923: "Use the host FpType's
arithmetic directly. Do NOT promote to a wider type, compute, and snap back."
two_prod_host broke that rule for bfloat16.

The residual dispatch had three paths: Veltkamp/Dekker for even precision, a
correctly-rounded fma for odd precision when 2p > 53, and a double intermediate
otherwise. The 2p > 53 test is a proxy for "a double cannot hold the exact
product" -- the 113-bit quad case of #1024 -- not a statement about whether the
type has an fma. bfloat16 has odd precision (p=7) and 2p=14, so it fell to the
double intermediate even though it has had a correctly-rounded fma since #1232.

The dispatch now tests for the fma itself, via a concept resolved with std::fma
visible so a native type finds the standard one and a Universal type finds its
own by ADL. A correctly-rounded fma rounds once, so fma(a,b,-p) is the exact
residual by construction at any width -- no splitting, no width arithmetic, no
wider intermediate.

Verified against the exact dyadic oracle, 200k random products per host:

    bfloat16   0 inexact   (and bit-identical to the double-intermediate path)
    float      0 inexact   (unchanged: even p, still Veltkamp)
    double     0 inexact   (unchanged: has its own specialisation)
    half       0 inexact   (and bit-identical to the old path, in-range operands)

This is a purity fix, not a convergence fix, and the distinction matters: e and
pi still saturate at 33 digits on bfloat16 and 37 on float, unchanged. That
ceiling is the host's exponent range, not its precision, and is addressed
separately. What this changes is that a block-shape study of narrow hosts is now
measuring narrow-host arithmetic rather than double arithmetic wearing a narrow
result type -- which is the difference between the study meaning something and
not.

46/46 e... (continued)

43043 of 50425 relevant lines covered (85.36%)

6898656.15 hits per line

Coverage Regressions

Lines Coverage ∆ File
11
31.07
-3.93% include/sw/universal/verification/test_suite_randoms.hpp
8
93.65
-0.48% include/sw/universal/number/cfloat/cfloat_impl.hpp
Jobs
ID Job ID Ran Files Coverage
1 32325826449.1 20 Aug 2026 03:23AM UTC 620
85.36
GitHub Action Run
Source Files on build 32325826449
  • Tree
  • List 620
  • Changed 3
  • Source Changed 1
  • Coverage Changed 3
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #32325826449
  • 27c0de02 on github
  • Prev Build on main (#32313539554)
  • Next Build on main (#32330082276)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc