FA-16021 / Floating-point arithmetic / Open access
Mantissa carry is reset to zero rather than the hidden one · case 01
Mantissa carry is reset to zero rather than the hidden one.
ROOT CAUSE
Mantissa carry is reset to zero rather than the hidden one. The faulty expression is q=0.
VERIFIED REPAIR
Apply the contract at this fault site using q=8.
Unsuccessful approach: The attempted local correction q=15 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
m,e=math.frexp(x)
e-=1
q=round(m*16)
if q == 16:
q=0
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 | -8 | 64 | Failed |
| 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 / 4e0ff88fdb388b7549f60792a9ef0e3fa088c9c22dc601f9288e4ed088d1f7c0
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|q
m,e=math.frexp(x)
e-=1
q=round(m*16)
if q == 16:
q=15
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 | 71 | 64 | Failed |
| 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 / 036db6526fdfce19223a287900c43270ac57a0e828ef6c58d60e5305566defd6
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.395677+00:00.
Case digest / b8304d29399fe430bc4b4920e8fb553a26c48932b00b42e09288bf16e1bd933d