FA-16506 / Floating-point arithmetic / Open access
Underflow does not accrue its implied inexact flag · case 01
Underflow does not accrue its implied inexact flag.
ROOT CAUSE
Underflow does not accrue its implied inexact flag. The faulty expression is if 'underflow' in new: new.discard('inexact').
VERIFIED REPAIR
Apply the contract at this fault site using if 'underflow' in new: new.add('inexact').
Unsuccessful approach: The attempted local correction if 'underflow' in new: new.add('overflow') still violates the explicit regression fixtures.
Case contract
Stipulated floating exception environment: apply an operation flag set, accrue sticky flags, select enabled trap by priority invalid/divzero/overflow/underflow/inexact, save prior state and clear only requested flags after reporting the trap. Inputs are valid flag names.
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(sticky, enabled, raised, clear):
priority=['invalid','divzero','overflow','underflow','inexact']
prior=set(sticky)
new=set(raised)
if 'overflow' in new: new.add('inexact')
if 'underflow' in new: new.discard('inexact')
accrued=prior|new
pending=new & set(enabled)
trap=next((flag for flag in priority if flag in pending),None)
remaining=accrued-set(clear)
return [sorted(prior),sorted(accrued),trap,sorted(remaining)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('sticky survives', solve(["invalid"],[],["inexact"],[]), [["invalid"],["inexact","invalid"],None,["inexact","invalid"]])
check('overflow implies inexact', solve([],[],["overflow"],[]), [[],["inexact","overflow"],None,["inexact","overflow"]])
check('underflow implies inexact', solve([],[],["underflow"],[]), [[],["inexact","underflow"],None,["inexact","underflow"]])
check('priority', solve([],["overflow","invalid"],["overflow","invalid"],[]), [[],["inexact","invalid","overflow"],"invalid",["inexact","invalid","overflow"]])
check('old flag no retrap', solve(["invalid"],["invalid"],["inexact"],[]), [["invalid"],["inexact","invalid"],None,["inexact","invalid"]])
check('clear after trap', solve([],["divzero"],["divzero"],["divzero"]), [[],["divzero"],"divzero",[]])
check('selective clear', solve(["invalid","inexact"],[],[],["inexact"]), [["inexact","invalid"],["inexact","invalid"],None,["invalid"]])
check('masked flag still sticky', solve([],[],["divzero"],[]), [[],["divzero"],None,["divzero"]])
check('five distinct flag sets', solve([],[],["invalid","divzero","inexact","underflow","overflow"][:N],[]), [[],sorted(["invalid","divzero","inexact","underflow","overflow"][:N]),None,sorted(["invalid","divzero","inexact","underflow","overflow"][:N])])
check('empty operation', solve(["inexact"] if N%2 else ["invalid"],[],[],[]), [["inexact"] if N%2 else ["invalid"],["inexact"] if N%2 else ["invalid"],None,["inexact"] if N%2 else ["invalid"]])
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 |
|---|---|---|---|
| sticky survives | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | Passed |
| overflow implies inexact | [[], ['inexact', 'overflow'], None, ['inexact', 'overflow']] | [[], ['inexact', 'overflow'], None, ['inexact', 'overflow']] | Passed |
| underflow implies inexact | [[], ['underflow'], None, ['underflow']] | [[], ['inexact', 'underflow'], None, ['inexact', 'underflow']] | Failed |
| priority | [[], ['inexact', 'invalid', 'overflow'], 'invalid', ['inexact', 'invalid', 'overflow']] | [[], ['inexact', 'invalid', 'overflow'], 'invalid', ['inexact', 'invalid', 'overflow']] | Passed |
| old flag no retrap | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | Passed |
| clear after trap | [[], ['divzero'], 'divzero', []] | [[], ['divzero'], 'divzero', []] | Passed |
| selective clear | [['inexact', 'invalid'], ['inexact', 'invalid'], None, ['invalid']] | [['inexact', 'invalid'], ['inexact', 'invalid'], None, ['invalid']] | Passed |
| masked flag still sticky | [[], ['divzero'], None, ['divzero']] | [[], ['divzero'], None, ['divzero']] | Passed |
| five distinct flag sets | [[], ['invalid'], None, ['invalid']] | [[], ['invalid'], None, ['invalid']] | Passed |
| empty operation | [['inexact'], ['inexact'], None, ['inexact']] | [['inexact'], ['inexact'], None, ['inexact']] | Passed |
SHA-256 / 40f282095a60f4cc2e37c6c11863f9b3965b7c1c83826f29bf6ec8bd72786af4
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(sticky, enabled, raised, clear):
priority=['invalid','divzero','overflow','underflow','inexact']
prior=set(sticky)
new=set(raised)
if 'overflow' in new: new.add('inexact')
if 'underflow' in new: new.add('overflow')
accrued=prior|new
pending=new & set(enabled)
trap=next((flag for flag in priority if flag in pending),None)
remaining=accrued-set(clear)
return [sorted(prior),sorted(accrued),trap,sorted(remaining)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('sticky survives', solve(["invalid"],[],["inexact"],[]), [["invalid"],["inexact","invalid"],None,["inexact","invalid"]])
check('overflow implies inexact', solve([],[],["overflow"],[]), [[],["inexact","overflow"],None,["inexact","overflow"]])
check('underflow implies inexact', solve([],[],["underflow"],[]), [[],["inexact","underflow"],None,["inexact","underflow"]])
check('priority', solve([],["overflow","invalid"],["overflow","invalid"],[]), [[],["inexact","invalid","overflow"],"invalid",["inexact","invalid","overflow"]])
check('old flag no retrap', solve(["invalid"],["invalid"],["inexact"],[]), [["invalid"],["inexact","invalid"],None,["inexact","invalid"]])
check('clear after trap', solve([],["divzero"],["divzero"],["divzero"]), [[],["divzero"],"divzero",[]])
check('selective clear', solve(["invalid","inexact"],[],[],["inexact"]), [["inexact","invalid"],["inexact","invalid"],None,["invalid"]])
check('masked flag still sticky', solve([],[],["divzero"],[]), [[],["divzero"],None,["divzero"]])
check('five distinct flag sets', solve([],[],["invalid","divzero","inexact","underflow","overflow"][:N],[]), [[],sorted(["invalid","divzero","inexact","underflow","overflow"][:N]),None,sorted(["invalid","divzero","inexact","underflow","overflow"][:N])])
check('empty operation', solve(["inexact"] if N%2 else ["invalid"],[],[],[]), [["inexact"] if N%2 else ["invalid"],["inexact"] if N%2 else ["invalid"],None,["inexact"] if N%2 else ["invalid"]])
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 |
|---|---|---|---|
| sticky survives | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | Passed |
| overflow implies inexact | [[], ['inexact', 'overflow'], None, ['inexact', 'overflow']] | [[], ['inexact', 'overflow'], None, ['inexact', 'overflow']] | Passed |
| underflow implies inexact | [[], ['overflow', 'underflow'], None, ['overflow', 'underflow']] | [[], ['inexact', 'underflow'], None, ['inexact', 'underflow']] | Failed |
| priority | [[], ['inexact', 'invalid', 'overflow'], 'invalid', ['inexact', 'invalid', 'overflow']] | [[], ['inexact', 'invalid', 'overflow'], 'invalid', ['inexact', 'invalid', 'overflow']] | Passed |
| old flag no retrap | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | Passed |
| clear after trap | [[], ['divzero'], 'divzero', []] | [[], ['divzero'], 'divzero', []] | Passed |
| selective clear | [['inexact', 'invalid'], ['inexact', 'invalid'], None, ['invalid']] | [['inexact', 'invalid'], ['inexact', 'invalid'], None, ['invalid']] | Passed |
| masked flag still sticky | [[], ['divzero'], None, ['divzero']] | [[], ['divzero'], None, ['divzero']] | Passed |
| five distinct flag sets | [[], ['invalid'], None, ['invalid']] | [[], ['invalid'], None, ['invalid']] | Passed |
| empty operation | [['inexact'], ['inexact'], None, ['inexact']] | [['inexact'], ['inexact'], None, ['inexact']] | Passed |
SHA-256 / 55f0b47a4fb92ee9361c1a24f4fef99f9a97e73ce5ba2f53f677224b5681502f
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(sticky, enabled, raised, clear):
priority=['invalid','divzero','overflow','underflow','inexact']
prior=set(sticky)
new=set(raised)
if 'overflow' in new: new.add('inexact')
if 'underflow' in new: new.add('inexact')
accrued=prior|new
pending=new & set(enabled)
trap=next((flag for flag in priority if flag in pending),None)
remaining=accrued-set(clear)
return [sorted(prior),sorted(accrued),trap,sorted(remaining)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('sticky survives', solve(["invalid"],[],["inexact"],[]), [["invalid"],["inexact","invalid"],None,["inexact","invalid"]])
check('overflow implies inexact', solve([],[],["overflow"],[]), [[],["inexact","overflow"],None,["inexact","overflow"]])
check('underflow implies inexact', solve([],[],["underflow"],[]), [[],["inexact","underflow"],None,["inexact","underflow"]])
check('priority', solve([],["overflow","invalid"],["overflow","invalid"],[]), [[],["inexact","invalid","overflow"],"invalid",["inexact","invalid","overflow"]])
check('old flag no retrap', solve(["invalid"],["invalid"],["inexact"],[]), [["invalid"],["inexact","invalid"],None,["inexact","invalid"]])
check('clear after trap', solve([],["divzero"],["divzero"],["divzero"]), [[],["divzero"],"divzero",[]])
check('selective clear', solve(["invalid","inexact"],[],[],["inexact"]), [["inexact","invalid"],["inexact","invalid"],None,["invalid"]])
check('masked flag still sticky', solve([],[],["divzero"],[]), [[],["divzero"],None,["divzero"]])
check('five distinct flag sets', solve([],[],["invalid","divzero","inexact","underflow","overflow"][:N],[]), [[],sorted(["invalid","divzero","inexact","underflow","overflow"][:N]),None,sorted(["invalid","divzero","inexact","underflow","overflow"][:N])])
check('empty operation', solve(["inexact"] if N%2 else ["invalid"],[],[],[]), [["inexact"] if N%2 else ["invalid"],["inexact"] if N%2 else ["invalid"],None,["inexact"] if N%2 else ["invalid"]])
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 |
|---|---|---|---|
| sticky survives | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | Passed |
| overflow implies inexact | [[], ['inexact', 'overflow'], None, ['inexact', 'overflow']] | [[], ['inexact', 'overflow'], None, ['inexact', 'overflow']] | Passed |
| underflow implies inexact | [[], ['inexact', 'underflow'], None, ['inexact', 'underflow']] | [[], ['inexact', 'underflow'], None, ['inexact', 'underflow']] | Passed |
| priority | [[], ['inexact', 'invalid', 'overflow'], 'invalid', ['inexact', 'invalid', 'overflow']] | [[], ['inexact', 'invalid', 'overflow'], 'invalid', ['inexact', 'invalid', 'overflow']] | Passed |
| old flag no retrap | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | [['invalid'], ['inexact', 'invalid'], None, ['inexact', 'invalid']] | Passed |
| clear after trap | [[], ['divzero'], 'divzero', []] | [[], ['divzero'], 'divzero', []] | Passed |
| selective clear | [['inexact', 'invalid'], ['inexact', 'invalid'], None, ['invalid']] | [['inexact', 'invalid'], ['inexact', 'invalid'], None, ['invalid']] | Passed |
| masked flag still sticky | [[], ['divzero'], None, ['divzero']] | [[], ['divzero'], None, ['divzero']] | Passed |
| five distinct flag sets | [[], ['invalid'], None, ['invalid']] | [[], ['invalid'], None, ['invalid']] | Passed |
| empty operation | [['inexact'], ['inexact'], None, ['inexact']] | [['inexact'], ['inexact'], None, ['inexact']] | Passed |
SHA-256 / 8c5448c45e7db988fee6d1d3a4465b7ef7ea27f47429fd410fe793b4f9f41077
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:37.000641+00:00.
Case digest / 6cbed5e18c25819211d3931dbe87384e2281b557019732ab605d9966f321eef2