FA-15871 / Floating-point arithmetic / Open access
Zero decoding conflates zero and subnormal · case 01
Zero decoding conflates zero and subnormal.
ROOT CAUSE
The zero exponent is interpreted without inspecting the fraction.
VERIFIED REPAIR
Classify zero only when both fields are zero.
Unsuccessful approach: Treating all zero exponents as zero erases subnormals.
Case contract
Decode an unsigned 64-bit IEEE binary64 encoding into sign, kind, unbiased exponent, integer significand, quiet flag and payload. Nonfinite fields use null; zero and subnormal exponents are -1022.
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(bits):
sign = -1 if bits >> 63 else 1
exp = (bits >> 52) & 2047
fraction = bits & ((1 << 52)-1)
if exp == 2047:
kind = 'nan' if fraction else 'infinity'
quiet = bool(fraction & (1 << 51)) if fraction else None
payload = fraction & ((1 << 51)-1) if fraction else None
return [sign, kind, None, None, quiet, payload]
kind = "subnormal" if exp == 0 else "normal"
unbiased = exp-1023 if exp else -1022
significand = fraction | (1 << 52) if exp else fraction
return [sign, kind, unbiased, significand, None, None]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('positive zero', solve(0), [1,'zero',-1022,0,None,None])
check('negative zero', solve(1<<63), [-1,'zero',-1022,0,None,None])
check('tiny subnormal', solve(N), [1,'subnormal',-1022,N,None,None])
check('negative subnormal', solve((1<<63)|N), [-1,'subnormal',-1022,N,None,None])
check('normal exact power', solve((1023+N)<<52), [1,'normal',N,1<<52,None,None])
check('normal fraction', solve((1023<<52)|N), [1,'normal',0,(1<<52)|N,None,None])
check('positive infinity', solve(2047<<52), [1,'infinity',None,None,None,None])
check('negative infinity', solve((1<<63)|(2047<<52)), [-1,'infinity',None,None,None,None])
check('quiet payload', solve((2047<<52)|(1<<51)|N), [1,'nan',None,None,True,N])
check('signaling payload', solve((2047<<52)|N), [1,'nan',None,None,False,N])
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 |
|---|---|---|---|
| positive zero | [1, 'subnormal', -1022, 0, None, None] | [1, 'zero', -1022, 0, None, None] | Failed |
| negative zero | [-1, 'subnormal', -1022, 0, None, None] | [-1, 'zero', -1022, 0, None, None] | Failed |
| tiny subnormal | [1, 'subnormal', -1022, 1, None, None] | [1, 'subnormal', -1022, 1, None, None] | Passed |
| negative subnormal | [-1, 'subnormal', -1022, 1, None, None] | [-1, 'subnormal', -1022, 1, None, None] | Passed |
| normal exact power | [1, 'normal', 1, 4503599627370496, None, None] | [1, 'normal', 1, 4503599627370496, None, None] | Passed |
| normal fraction | [1, 'normal', 0, 4503599627370497, None, None] | [1, 'normal', 0, 4503599627370497, None, None] | Passed |
| positive infinity | [1, 'infinity', None, None, None, None] | [1, 'infinity', None, None, None, None] | Passed |
| negative infinity | [-1, 'infinity', None, None, None, None] | [-1, 'infinity', None, None, None, None] | Passed |
| quiet payload | [1, 'nan', None, None, True, 1] | [1, 'nan', None, None, True, 1] | Passed |
| signaling payload | [1, 'nan', None, None, False, 1] | [1, 'nan', None, None, False, 1] | Passed |
SHA-256 / a95ecd5f72dfd9f3d68a613d4af20569bd48d7ba43093e2e62952c6edeca2bc8
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(bits):
sign = -1 if bits >> 63 else 1
exp = (bits >> 52) & 2047
fraction = bits & ((1 << 52)-1)
if exp == 2047:
kind = 'nan' if fraction else 'infinity'
quiet = bool(fraction & (1 << 51)) if fraction else None
payload = fraction & ((1 << 51)-1) if fraction else None
return [sign, kind, None, None, quiet, payload]
kind = "zero" if exp == 0 else "normal"
unbiased = exp-1023 if exp else -1022
significand = fraction | (1 << 52) if exp else fraction
return [sign, kind, unbiased, significand, None, None]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('positive zero', solve(0), [1,'zero',-1022,0,None,None])
check('negative zero', solve(1<<63), [-1,'zero',-1022,0,None,None])
check('tiny subnormal', solve(N), [1,'subnormal',-1022,N,None,None])
check('negative subnormal', solve((1<<63)|N), [-1,'subnormal',-1022,N,None,None])
check('normal exact power', solve((1023+N)<<52), [1,'normal',N,1<<52,None,None])
check('normal fraction', solve((1023<<52)|N), [1,'normal',0,(1<<52)|N,None,None])
check('positive infinity', solve(2047<<52), [1,'infinity',None,None,None,None])
check('negative infinity', solve((1<<63)|(2047<<52)), [-1,'infinity',None,None,None,None])
check('quiet payload', solve((2047<<52)|(1<<51)|N), [1,'nan',None,None,True,N])
check('signaling payload', solve((2047<<52)|N), [1,'nan',None,None,False,N])
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 |
|---|---|---|---|
| positive zero | [1, 'zero', -1022, 0, None, None] | [1, 'zero', -1022, 0, None, None] | Passed |
| negative zero | [-1, 'zero', -1022, 0, None, None] | [-1, 'zero', -1022, 0, None, None] | Passed |
| tiny subnormal | [1, 'zero', -1022, 1, None, None] | [1, 'subnormal', -1022, 1, None, None] | Failed |
| negative subnormal | [-1, 'zero', -1022, 1, None, None] | [-1, 'subnormal', -1022, 1, None, None] | Failed |
| normal exact power | [1, 'normal', 1, 4503599627370496, None, None] | [1, 'normal', 1, 4503599627370496, None, None] | Passed |
| normal fraction | [1, 'normal', 0, 4503599627370497, None, None] | [1, 'normal', 0, 4503599627370497, None, None] | Passed |
| positive infinity | [1, 'infinity', None, None, None, None] | [1, 'infinity', None, None, None, None] | Passed |
| negative infinity | [-1, 'infinity', None, None, None, None] | [-1, 'infinity', None, None, None, None] | Passed |
| quiet payload | [1, 'nan', None, None, True, 1] | [1, 'nan', None, None, True, 1] | Passed |
| signaling payload | [1, 'nan', None, None, False, 1] | [1, 'nan', None, None, False, 1] | Passed |
SHA-256 / 1da88fa948d48fa09de007ab2dfd67a441d7dbfbe8ff6717ee626e4b7342860a
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(bits):
sign = -1 if bits >> 63 else 1
exp = (bits >> 52) & 2047
fraction = bits & ((1 << 52)-1)
if exp == 2047:
kind = 'nan' if fraction else 'infinity'
quiet = bool(fraction & (1 << 51)) if fraction else None
payload = fraction & ((1 << 51)-1) if fraction else None
return [sign, kind, None, None, quiet, payload]
kind = 'zero' if exp == 0 and fraction == 0 else 'subnormal' if exp == 0 else 'normal'
unbiased = exp-1023 if exp else -1022
significand = fraction | (1 << 52) if exp else fraction
return [sign, kind, unbiased, significand, None, None]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('positive zero', solve(0), [1,'zero',-1022,0,None,None])
check('negative zero', solve(1<<63), [-1,'zero',-1022,0,None,None])
check('tiny subnormal', solve(N), [1,'subnormal',-1022,N,None,None])
check('negative subnormal', solve((1<<63)|N), [-1,'subnormal',-1022,N,None,None])
check('normal exact power', solve((1023+N)<<52), [1,'normal',N,1<<52,None,None])
check('normal fraction', solve((1023<<52)|N), [1,'normal',0,(1<<52)|N,None,None])
check('positive infinity', solve(2047<<52), [1,'infinity',None,None,None,None])
check('negative infinity', solve((1<<63)|(2047<<52)), [-1,'infinity',None,None,None,None])
check('quiet payload', solve((2047<<52)|(1<<51)|N), [1,'nan',None,None,True,N])
check('signaling payload', solve((2047<<52)|N), [1,'nan',None,None,False,N])
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 |
|---|---|---|---|
| positive zero | [1, 'zero', -1022, 0, None, None] | [1, 'zero', -1022, 0, None, None] | Passed |
| negative zero | [-1, 'zero', -1022, 0, None, None] | [-1, 'zero', -1022, 0, None, None] | Passed |
| tiny subnormal | [1, 'subnormal', -1022, 1, None, None] | [1, 'subnormal', -1022, 1, None, None] | Passed |
| negative subnormal | [-1, 'subnormal', -1022, 1, None, None] | [-1, 'subnormal', -1022, 1, None, None] | Passed |
| normal exact power | [1, 'normal', 1, 4503599627370496, None, None] | [1, 'normal', 1, 4503599627370496, None, None] | Passed |
| normal fraction | [1, 'normal', 0, 4503599627370497, None, None] | [1, 'normal', 0, 4503599627370497, None, None] | Passed |
| positive infinity | [1, 'infinity', None, None, None, None] | [1, 'infinity', None, None, None, None] | Passed |
| negative infinity | [-1, 'infinity', None, None, None, None] | [-1, 'infinity', None, None, None, None] | Passed |
| quiet payload | [1, 'nan', None, None, True, 1] | [1, 'nan', None, None, True, 1] | Passed |
| signaling payload | [1, 'nan', None, None, False, 1] | [1, 'nan', None, None, False, 1] | Passed |
SHA-256 / ade469eac871c68aa636078841755720c4f4167ad2c11862b5cbea2f94e013a1
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:30.945423+00:00.
Case digest / c8810e7b30989398f0486ec4324972cb6b03cbf019cd2f90e6f8675512f9ce72