serialize.cs 1.2.0 — two roundings by language guarantee, and zero-bit fixed point at every width
Fixed
The compressed_float write path performs its two roundings by language guarantee, not JIT accident — a wire-correctness fix on FMA-boundary values. The quantization computed product and add in one expression, and ECMA-334 permits floating point to run at higher precision than the result type: the two roundings STANDARD.md requires were guaranteed only by RyuJIT's current behavior. Both sites now flow through one internal helper that stores the product through a float local with explicit (float) casts — the C# language-level guarantee that excess precision is discarded. On any host whose JIT fused the expression, written bytes change exactly on the boundary values where one rounding and two disagree; that is the fix, not a side effect, and test_compressed_float_quantization_boundaries pins the written integers. (This supersedes the earlier hold on shipping the pin: an intermediate that moves bytes only where the fused form was nonconformant is a correction, not a regression.) (680ac75)
A degenerate fixed range costs zero bits on every storage width. The narrow path always knew it; the 128-bit path computed fractionBits of zeros — the same declared field, two wire encodings, selected by an internal storage-width detail (serialize#54's C# half). The wide params now cost min == max nothing, in the one helper write, read and measure share, pinned by CheckFixedDegenerateWide across Q112.16 signed and unsigned, a negative bound, and Q64.64 — proven able to fail against the pre-fix params. The vendored STANDARD.md is resynced to the upstream revision that adopted the ruling. (#9)
Conformance
The interop gate pins C++ at v1.7.0 and the compat sequence carries the six fixed/128 fields — the cross-language byte-identity proof now covers exactly the operations the fixed-point family added. (#8)
CI
- Windows joins the test matrix — this library exists for Unity, Unity authors on Windows, and it had never once compiled there. (#6)
- The red team harness runs and its exit code is the verdict: no throw, no hang, no over-allocation, no out-of-bounds, errors as values. It was compiling in CI while nobody read its answers. One counted class stays open by design — non-finite decodes through
compressed_floatparams whose delta overflows to infinity, kept for C++ parity pending an open family decision the harness must not preempt. (#6) - Analyzers and style gate, verify-only, across all five projects. (#6)
- The CAA gate: the org's cla.yml, verbatim. (#7)