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

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

Build:
Build:
LAST BUILD BRANCH: main
DEFAULT BRANCH: master
Ran 19 Aug 2026 03:34AM 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

19 Aug 2026 03:02AM UTC coverage: 85.367% (-0.05%) from 85.42%
32210723592

push

github

web-flow
fix: classify IEEE NaN by exponent and mantissa, not by exact payload (#1346)

Converting a signaling NaN into a narrower cfloat produced INFINITY.  The
classification compared the source fraction for EQUALITY against three specific
payloads, so every other payload -- including the canonical signalling 0x1 --
missed all three, fell through to the numeric path, and was projected to
infinity.  std::nan("") is one of the three, which is why the existing coverage
never saw it.  Downstream, 2040 of binary16's 2046 NaN encodings decoded to the
wrong class of value.

The same block had been copy-pasted six times across four types, and all six now
use IEEE-754's rule: exponent all ones with a ZERO fraction is infinity, with ANY
non-zero fraction is a NaN, and the fraction's MSB decides which kind.

  cfloat        three copies, collapsed into one helper; sNaN became +inf
  lns           sNaN became a finite value
  dbns          sNaN became a finite value
  blocktriple   sNaN became a finite value -- the consequential one, since
                blocktriple is what the arithmetic paths run on, so a NaN
                operand entering an add or multiply stopped propagating

Also fixed: blocktriple's special-value branches never cleared _zero, so a
converted NaN reported isnan() AND iszero() at once, and iszero() is what the
arithmetic shortcuts consult.  That predates this change; the infinity branch had
it too.

MSVC needed a decision rather than a fix.  Its signaling_NaN() is 0x7FC00001 --
the quiet bit is SET -- so it is a quiet NaN by IEEE whatever the name says, and
to_ieee754() was emitting it for signalling cfloats.  The old code round-tripped
it only by matching that exact payload, which is the same mechanism that turned
every other NaN into infinity.  The classification stays IEEE and MSVC joins
RISC-V, ARM and POWER in UNIVERSAL_SNAN_ROUND_TRIPS_NATIVE_FP, which already
exists for platforms where the round-trip cannot hold.

Four regression suites, b... (continued)

67 of 110 new or added lines in 5 files covered. (60.91%)

43048 of 50427 relevant lines covered (85.37%)

6898207.75 hits per line

Uncovered Changes

Lines Coverage ∆ File
43
50.57
internal/blocktriple/conversion/nan_conversion.cpp
Jobs
ID Job ID Ran Files Coverage
1 32210723592.1 19 Aug 2026 03:34AM UTC 620
85.37
GitHub Action Run
Source Files on build 32210723592
  • Tree
  • List 620
  • Changed 4
  • Source Changed 4
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #32210723592
  • 4b519c89 on github
  • Prev Build on main (#32099078201)
  • Next Build on main (#32250968883)
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