FA-16636 / Floating-point arithmetic / Open access
Exact ratio reduction moves exponent in the wrong direction · case 01
Exact ratio reduction moves exponent in the wrong direction.
ROOT CAUSE
Exact ratio reduction moves exponent in the wrong direction. The faulty expression is power+=2.
VERIFIED REPAIR
Apply the contract at this fault site using power+=1.
Unsuccessful approach: The attempted local correction power+=0 still violates the explicit regression fixtures.
Case contract
Decode a finite binary64 value into its exact reduced signed numerator and positive power-of-two denominator, using (0,1) for either zero. Infinity and NaN return null.
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
e=(bits>>52)&2047
f=bits&((1<<52)-1)
if e==2047: return None
if e:
mantissa=f|(1<<52)
power=e-1023-52
else:
mantissa=f
power=-1074
if mantissa==0: return [0,1]
while power<0 and mantissa%2==0:
mantissa//=2
power+=2
if power>=0: return [sign*(mantissa<<power),1]
return [sign*mantissa,1<<(-power)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('large integer', solve((1023+60+N)<<52), [1<<(60+N),1])
check('positive integer', solve((1023+N)<<52), [1<<N,1])
check('negative integer', solve((1<<63)|((1023+N)<<52)), [-(1<<N),1])
check('fraction', solve(0x3fe0000000000000), [1,2])
check('nontrivial fraction', solve(0x3fe8000000000000), [3,4])
check('minimum subnormal', solve(N), list(math.ldexp(float(N),-1074).as_integer_ratio()))
check('negative subnormal', solve((1<<63)|N), list((-math.ldexp(float(N),-1074)).as_integer_ratio()))
check('zero', solve(0), [0,1])
check('negative zero', solve(1<<63), [0,1])
check('infinity', solve(0x7ff0000000000000), None)
check('nan', solve(0x7ff8000000000000|N), None)
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 |
|---|---|---|---|
| large integer | [2305843009213693952, 1] | [2305843009213693952, 1] | Passed |
| positive integer | [134217728, 1] | [2, 1] | Failed |
| negative integer | [-134217728, 1] | [-2, 1] | Failed |
| fraction | [67108864, 1] | [1, 2] | Failed |
| nontrivial fraction | [100663296, 1] | [3, 4] | Failed |
| minimum subnormal | [1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | [1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | Passed |
| negative subnormal | [-1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | [-1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | Passed |
| zero | [0, 1] | [0, 1] | Passed |
| negative zero | [0, 1] | [0, 1] | Passed |
| infinity | None | None | Passed |
| nan | None | None | Passed |
SHA-256 / c6827410a2a94caf44cc5f597fdf17d6f41efd892eed174a57226ae84429a7df
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
e=(bits>>52)&2047
f=bits&((1<<52)-1)
if e==2047: return None
if e:
mantissa=f|(1<<52)
power=e-1023-52
else:
mantissa=f
power=-1074
if mantissa==0: return [0,1]
while power<0 and mantissa%2==0:
mantissa//=2
power+=0
if power>=0: return [sign*(mantissa<<power),1]
return [sign*mantissa,1<<(-power)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('large integer', solve((1023+60+N)<<52), [1<<(60+N),1])
check('positive integer', solve((1023+N)<<52), [1<<N,1])
check('negative integer', solve((1<<63)|((1023+N)<<52)), [-(1<<N),1])
check('fraction', solve(0x3fe0000000000000), [1,2])
check('nontrivial fraction', solve(0x3fe8000000000000), [3,4])
check('minimum subnormal', solve(N), list(math.ldexp(float(N),-1074).as_integer_ratio()))
check('negative subnormal', solve((1<<63)|N), list((-math.ldexp(float(N),-1074)).as_integer_ratio()))
check('zero', solve(0), [0,1])
check('negative zero', solve(1<<63), [0,1])
check('infinity', solve(0x7ff0000000000000), None)
check('nan', solve(0x7ff8000000000000|N), None)
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 |
|---|---|---|---|
| large integer | [2305843009213693952, 1] | [2305843009213693952, 1] | Passed |
| positive integer | [1, 2251799813685248] | [2, 1] | Failed |
| negative integer | [-1, 2251799813685248] | [-2, 1] | Failed |
| fraction | [1, 9007199254740992] | [1, 2] | Failed |
| nontrivial fraction | [3, 9007199254740992] | [3, 4] | Failed |
| minimum subnormal | [1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | [1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | Passed |
| negative subnormal | [-1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | [-1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | Passed |
| zero | [0, 1] | [0, 1] | Passed |
| negative zero | [0, 1] | [0, 1] | Passed |
| infinity | None | None | Passed |
| nan | None | None | Passed |
SHA-256 / b7143a188cfa1de1549db5c423083ccc7f180b6c6cadb8ad96e13a1fda5da04a
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
e=(bits>>52)&2047
f=bits&((1<<52)-1)
if e==2047: return None
if e:
mantissa=f|(1<<52)
power=e-1023-52
else:
mantissa=f
power=-1074
if mantissa==0: return [0,1]
while power<0 and mantissa%2==0:
mantissa//=2
power+=1
if power>=0: return [sign*(mantissa<<power),1]
return [sign*mantissa,1<<(-power)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('large integer', solve((1023+60+N)<<52), [1<<(60+N),1])
check('positive integer', solve((1023+N)<<52), [1<<N,1])
check('negative integer', solve((1<<63)|((1023+N)<<52)), [-(1<<N),1])
check('fraction', solve(0x3fe0000000000000), [1,2])
check('nontrivial fraction', solve(0x3fe8000000000000), [3,4])
check('minimum subnormal', solve(N), list(math.ldexp(float(N),-1074).as_integer_ratio()))
check('negative subnormal', solve((1<<63)|N), list((-math.ldexp(float(N),-1074)).as_integer_ratio()))
check('zero', solve(0), [0,1])
check('negative zero', solve(1<<63), [0,1])
check('infinity', solve(0x7ff0000000000000), None)
check('nan', solve(0x7ff8000000000000|N), None)
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 |
|---|---|---|---|
| large integer | [2305843009213693952, 1] | [2305843009213693952, 1] | Passed |
| positive integer | [2, 1] | [2, 1] | Passed |
| negative integer | [-2, 1] | [-2, 1] | Passed |
| fraction | [1, 2] | [1, 2] | Passed |
| nontrivial fraction | [3, 4] | [3, 4] | Passed |
| minimum subnormal | [1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | [1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | Passed |
| negative subnormal | [-1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | [-1, 202402253307310618352495346718917307049556649764142118356901358027430339567995346891960383701437124495187077864316811911389808737385793476867013399940738509921517424276566361364466907742093216341239767678472745068562007483424692698618103355649159556340810056512358769552333414615230502532186327508646006263307707741093494784] | Passed |
| zero | [0, 1] | [0, 1] | Passed |
| negative zero | [0, 1] | [0, 1] | Passed |
| infinity | None | None | Passed |
| nan | None | None | Passed |
SHA-256 / 232c5cccac878943ca1770bff8d7a21afb5af3860d3181aefa1b46f6590a6293
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:38.073764+00:00.
Case digest / 6e3618056ccb8ee93d458520daa7f90ea16d52fd811a2b9fc13797e4d6eaef29