← board

xtensa formats a Double with Single-width digits and a 2-digit exponent

Measured at binary b91c0ceab90b, commit d702b0641, via test/test_cross_float.pas against the x86-64 oracle:

xtensa            oracle
 3.500000000E+00   3.5000000000000000E+000
-5.000000000E-01  -5.0000000000000000E-001
 3.000000000E+00   3.0000000000000000E+000
 7.500000000E-01   7.5000000000000000E-001

The values are right. 3.5, -0.5, 3.0, 0.75 all round-trip correctly. What differs is the presentation: 10 significant digits vs 17, and a 2-digit exponent field vs 3. That is the shape Write uses for a Single, applied to a Double — so the likely cause is the formatting path selecting its width from something that is tySingle on this target, rather than a precision loss in the arithmetic.

Why this is F and not a plain bug (rank the mechanism, never the datatype): the mechanism is float formatting — digit count and exponent form — which the 2026-08-19 ruling puts in F explicitly. It is not a crash, a wrong value, or control flow that merely lives in float code. Hence float/, which ready and next do not scan, and prio 25.

Bound

Hosted xtensa, Call0, --platform=posix --xtensa-soft-mulhigh. This is the last remaining real divergence in that differential: 117 match / 3 differ / 20 do not compile of 140, and the other two differing rows are artifacts of comparing naively to the oracle rather than through their real Makefile recipes. See working/bug-a-hosted-xtensa-diverges-from-the-oracle-on-21-cross-programs.

Repro is one line: ./compiler/pascal26 --target=xtensa --platform=posix --xtensa-soft-mulhigh test/test_cross_float.pas <out> then qemu-xtensa <out> against a native build of the same source.

Start at the width selection, not the arithmetic — the digits that ARE printed are correct, so whatever computes them is fine and whatever decides how many to print is not.