FA-16006 / Floating-point arithmetic / Open access
Subnormal rounding carry is masked away · case 01
Subnormal rounding carry is masked away.
ROOT CAUSE
Subnormal rounding carry is masked away. The faulty expression is return sign|(q&7).
VERIFIED REPAIR
Apply the contract at this fault site using return sign|q.
Unsuccessful approach: The attempted local correction return sign|min(q,7) still violates the explicit regression fixtures.
Case contract
Encode finite exactly represented dyadic x into sign/4-bit-exponent/3-bit-fraction toy float with bias 7, gradual underflow, round-to-nearest-even and infinity overflow. Return the unsigned byte. The miniature format is stipulated, not a hardware conformance claim.
Why this case matters
An offline floating representation model isolates a reproducible arithmetic fault.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
import struct
N = 1
observations = []
def solve(x):
sign=128 if math.copysign(1.0,x)<0 else 0
x=abs(x)
if x == 0: return sign
if x >= 248: return sign|120
if x < 2**-6:
q=round(x*512)
return sign|(q&7)
m,e=math.frexp(x)
e-=1
q=round(m*16)
if q == 16:
q=8
e+=1
if e>7: return sign|120
exponent=e+7
fraction=q-8
return sign|(exponent<<3)|fraction
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('zero', solve(0.0), 0)
check('negative zero', solve(-0.0), 128)
check('subnormal', solve(N/512), N)
check('negative subnormal', solve(-N/512), 128|N)
check('underflow tie', solve(1/1024), 0)
check('subnormal carry', solve(15/1024), 8)
check('normal varying', solve(2.0**N), (N+7)<<3)
check('normal fraction', solve((8+N)/8), 56+N)
check('binade carry', solve(1.9375), 64)
check('below midpoint', solve(1.90625), 63)
check('largest finite', solve(240.0), 119)
check('overflow tie', solve(248.0), 120)
check('negative overflow', solve(-256.0), 248)
check('minimum normal', solve(1/64), 8)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| zero | 0 | 0 | Passed |
| negative zero | 128 | 128 | Passed |
| subnormal | 1 | 1 | Passed |
| negative subnormal | 129 | 129 | Passed |
| underflow tie | 0 | 0 | Passed |
| subnormal carry | 0 | 8 | Failed |
| normal varying | 64 | 64 | Passed |
| normal fraction | 57 | 57 | Passed |
| binade carry | 64 | 64 | Passed |
| below midpoint | 63 | 63 | Passed |
| largest finite | 119 | 119 | Passed |
| overflow tie | 120 | 120 | Passed |
| negative overflow | 248 | 248 | Passed |
| minimum normal | 8 | 8 | Passed |
SHA-256 / c1ff97412890a5779dcf4f4a14cf69647327fe9bb163c9aff9b150a29aec7894
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
import struct
N = 1
observations = []
def solve(x):
sign=128 if math.copysign(1.0,x)<0 else 0
x=abs(x)
if x == 0: return sign
if x >= 248: return sign|120
if x < 2**-6:
q=round(x*512)
return sign|min(q,7)
m,e=math.frexp(x)
e-=1
q=round(m*16)
if q == 16:
q=8
e+=1
if e>7: return sign|120
exponent=e+7
fraction=q-8
return sign|(exponent<<3)|fraction
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('zero', solve(0.0), 0)
check('negative zero', solve(-0.0), 128)
check('subnormal', solve(N/512), N)
check('negative subnormal', solve(-N/512), 128|N)
check('underflow tie', solve(1/1024), 0)
check('subnormal carry', solve(15/1024), 8)
check('normal varying', solve(2.0**N), (N+7)<<3)
check('normal fraction', solve((8+N)/8), 56+N)
check('binade carry', solve(1.9375), 64)
check('below midpoint', solve(1.90625), 63)
check('largest finite', solve(240.0), 119)
check('overflow tie', solve(248.0), 120)
check('negative overflow', solve(-256.0), 248)
check('minimum normal', solve(1/64), 8)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| zero | 0 | 0 | Passed |
| negative zero | 128 | 128 | Passed |
| subnormal | 1 | 1 | Passed |
| negative subnormal | 129 | 129 | Passed |
| underflow tie | 0 | 0 | Passed |
| subnormal carry | 7 | 8 | Failed |
| normal varying | 64 | 64 | Passed |
| normal fraction | 57 | 57 | Passed |
| binade carry | 64 | 64 | Passed |
| below midpoint | 63 | 63 | Passed |
| largest finite | 119 | 119 | Passed |
| overflow tie | 120 | 120 | Passed |
| negative overflow | 248 | 248 | Passed |
| minimum normal | 8 | 8 | Passed |
SHA-256 / eaaafc218f2282d5f0e17f2a12c3660361885207d3bddc49552676dad483ea47
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
import struct
N = 1
observations = []
def solve(x):
sign=128 if math.copysign(1.0,x)<0 else 0
x=abs(x)
if x == 0: return sign
if x >= 248: return sign|120
if x < 2**-6:
q=round(x*512)
return sign|q
m,e=math.frexp(x)
e-=1
q=round(m*16)
if q == 16:
q=8
e+=1
if e>7: return sign|120
exponent=e+7
fraction=q-8
return sign|(exponent<<3)|fraction
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('zero', solve(0.0), 0)
check('negative zero', solve(-0.0), 128)
check('subnormal', solve(N/512), N)
check('negative subnormal', solve(-N/512), 128|N)
check('underflow tie', solve(1/1024), 0)
check('subnormal carry', solve(15/1024), 8)
check('normal varying', solve(2.0**N), (N+7)<<3)
check('normal fraction', solve((8+N)/8), 56+N)
check('binade carry', solve(1.9375), 64)
check('below midpoint', solve(1.90625), 63)
check('largest finite', solve(240.0), 119)
check('overflow tie', solve(248.0), 120)
check('negative overflow', solve(-256.0), 248)
check('minimum normal', solve(1/64), 8)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| zero | 0 | 0 | Passed |
| negative zero | 128 | 128 | Passed |
| subnormal | 1 | 1 | Passed |
| negative subnormal | 129 | 129 | Passed |
| underflow tie | 0 | 0 | Passed |
| subnormal carry | 8 | 8 | Passed |
| normal varying | 64 | 64 | Passed |
| normal fraction | 57 | 57 | Passed |
| binade carry | 64 | 64 | Passed |
| below midpoint | 63 | 63 | Passed |
| largest finite | 119 | 119 | Passed |
| overflow tie | 120 | 120 | Passed |
| negative overflow | 248 | 248 | Passed |
| minimum normal | 8 | 8 | Passed |
SHA-256 / a4885c1da227084f5313862887aa4cd62946fb499325336c2d369be5452b6fec
Verification & scope
Controlled binary64 or explicitly stipulated miniature format; no hardware exception flags or platform floating environment are modeled. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:39:32.138904+00:00.
Case digest / e3997b11c2516bbfbfde866fb0c14652cfff2393b7d2c78f536e227c033af4df