FA-16876 / Floating-point arithmetic / Open access
Decimal quantization passes source text through a binary float · case 01
Decimal quantization passes source text through a binary float.
ROOT CAUSE
Decimal quantization passes source text through a binary float. The faulty expression is value=Decimal(float(text)).
VERIFIED REPAIR
Apply the contract at this fault site using value=Decimal(text).
Unsuccessful approach: The attempted local correction value=Decimal(str(round(float(text),2))) still violates the explicit regression fixtures.
Case contract
Quantize a decimal text to 10**exponent using a fresh precision-limited decimal context, half-even rounding, Emin=-9 and Emax=9. All traps are disabled; return result string and raised flag names. The coefficient precision includes trailing zeros imposed by the target quantum.
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 decimal
from decimal import Decimal, Context, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_DOWN
N = 1
observations = []
def solve(text, exponent, precision):
ctx=Context(prec=precision,rounding=ROUND_HALF_EVEN,Emin=-9,Emax=9)
for signal in ctx.traps: ctx.traps[signal]=False
ctx.clear_flags()
value=Decimal(float(text))
quantum=Decimal((0,(1,),exponent))
result=ctx.quantize(value,quantum)
flags=sorted(signal.__name__ for signal,raised in ctx.flags.items() if raised)
return [str(result),flags]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('tie odd', solve(str(N)+".255",-2,6), [str(N)+".26",["Inexact","Rounded"]])
check('tie even', solve(str(N)+".245",-2,6), [str(N)+".24",["Inexact","Rounded"]])
check('rounded exact', solve(str(N)+".200",-2,6), [str(N)+".20",["Rounded"]])
check('already exact', solve(str(N)+".20",-2,6), [str(N)+".20",[]])
check('one excess digit', solve("123.45",-2,4), ["NaN",["InvalidOperation"]])
check('coefficient too large', solve("12345.67",-2,4), ["NaN",["InvalidOperation"]])
check('subnormal exact', solve("1e-10",-10,6), ["1E-10",["Subnormal"]])
check('negative zero', solve("-0.004",-2,6), ["-0.00",["Inexact","Rounded"]])
check('positive zero', solve("0.004",-2,6), ["0.00",["Inexact","Rounded"]])
check('integer quantum', solve("123.4",1,6), ["1.2E+2",["Inexact","Rounded"]])
check('overflow exponent', solve("1e10",0,6), ["NaN",["InvalidOperation"]])
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 |
|---|---|---|---|
| tie odd | ['1.25', ['Inexact', 'Rounded']] | ['1.26', ['Inexact', 'Rounded']] | Failed |
| tie even | ['1.25', ['Inexact', 'Rounded']] | ['1.24', ['Inexact', 'Rounded']] | Failed |
| rounded exact | ['1.20', ['Inexact', 'Rounded']] | ['1.20', ['Rounded']] | Failed |
| already exact | ['1.20', ['Inexact', 'Rounded']] | ['1.20', []] | Failed |
| one excess digit | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
| coefficient too large | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
| subnormal exact | ['1E-10', ['Inexact', 'Rounded', 'Subnormal']] | ['1E-10', ['Subnormal']] | Failed |
| negative zero | ['-0.00', ['Inexact', 'Rounded']] | ['-0.00', ['Inexact', 'Rounded']] | Passed |
| positive zero | ['0.00', ['Inexact', 'Rounded']] | ['0.00', ['Inexact', 'Rounded']] | Passed |
| integer quantum | ['1.2E+2', ['Inexact', 'Rounded']] | ['1.2E+2', ['Inexact', 'Rounded']] | Passed |
| overflow exponent | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
SHA-256 / ba490d2d8511a90597b03a47cac4460bd73584edc145f7e8d0264ffb4ec81055
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
import decimal
from decimal import Decimal, Context, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_DOWN
N = 1
observations = []
def solve(text, exponent, precision):
ctx=Context(prec=precision,rounding=ROUND_HALF_EVEN,Emin=-9,Emax=9)
for signal in ctx.traps: ctx.traps[signal]=False
ctx.clear_flags()
value=Decimal(str(round(float(text),2)))
quantum=Decimal((0,(1,),exponent))
result=ctx.quantize(value,quantum)
flags=sorted(signal.__name__ for signal,raised in ctx.flags.items() if raised)
return [str(result),flags]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('tie odd', solve(str(N)+".255",-2,6), [str(N)+".26",["Inexact","Rounded"]])
check('tie even', solve(str(N)+".245",-2,6), [str(N)+".24",["Inexact","Rounded"]])
check('rounded exact', solve(str(N)+".200",-2,6), [str(N)+".20",["Rounded"]])
check('already exact', solve(str(N)+".20",-2,6), [str(N)+".20",[]])
check('one excess digit', solve("123.45",-2,4), ["NaN",["InvalidOperation"]])
check('coefficient too large', solve("12345.67",-2,4), ["NaN",["InvalidOperation"]])
check('subnormal exact', solve("1e-10",-10,6), ["1E-10",["Subnormal"]])
check('negative zero', solve("-0.004",-2,6), ["-0.00",["Inexact","Rounded"]])
check('positive zero', solve("0.004",-2,6), ["0.00",["Inexact","Rounded"]])
check('integer quantum', solve("123.4",1,6), ["1.2E+2",["Inexact","Rounded"]])
check('overflow exponent', solve("1e10",0,6), ["NaN",["InvalidOperation"]])
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 |
|---|---|---|---|
| tie odd | ['1.25', []] | ['1.26', ['Inexact', 'Rounded']] | Failed |
| tie even | ['1.25', []] | ['1.24', ['Inexact', 'Rounded']] | Failed |
| rounded exact | ['1.20', []] | ['1.20', ['Rounded']] | Failed |
| already exact | ['1.20', []] | ['1.20', []] | Passed |
| one excess digit | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
| coefficient too large | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
| subnormal exact | ['0E-10', []] | ['1E-10', ['Subnormal']] | Failed |
| negative zero | ['-0.00', []] | ['-0.00', ['Inexact', 'Rounded']] | Failed |
| positive zero | ['0.00', []] | ['0.00', ['Inexact', 'Rounded']] | Failed |
| integer quantum | ['1.2E+2', ['Inexact', 'Rounded']] | ['1.2E+2', ['Inexact', 'Rounded']] | Passed |
| overflow exponent | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
SHA-256 / 2a335aa6a6f8004d7d3f94b59fc61c2e8f377dcbae679bae57304cdbbd07327c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
import decimal
from decimal import Decimal, Context, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_DOWN
N = 1
observations = []
def solve(text, exponent, precision):
ctx=Context(prec=precision,rounding=ROUND_HALF_EVEN,Emin=-9,Emax=9)
for signal in ctx.traps: ctx.traps[signal]=False
ctx.clear_flags()
value=Decimal(text)
quantum=Decimal((0,(1,),exponent))
result=ctx.quantize(value,quantum)
flags=sorted(signal.__name__ for signal,raised in ctx.flags.items() if raised)
return [str(result),flags]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('tie odd', solve(str(N)+".255",-2,6), [str(N)+".26",["Inexact","Rounded"]])
check('tie even', solve(str(N)+".245",-2,6), [str(N)+".24",["Inexact","Rounded"]])
check('rounded exact', solve(str(N)+".200",-2,6), [str(N)+".20",["Rounded"]])
check('already exact', solve(str(N)+".20",-2,6), [str(N)+".20",[]])
check('one excess digit', solve("123.45",-2,4), ["NaN",["InvalidOperation"]])
check('coefficient too large', solve("12345.67",-2,4), ["NaN",["InvalidOperation"]])
check('subnormal exact', solve("1e-10",-10,6), ["1E-10",["Subnormal"]])
check('negative zero', solve("-0.004",-2,6), ["-0.00",["Inexact","Rounded"]])
check('positive zero', solve("0.004",-2,6), ["0.00",["Inexact","Rounded"]])
check('integer quantum', solve("123.4",1,6), ["1.2E+2",["Inexact","Rounded"]])
check('overflow exponent', solve("1e10",0,6), ["NaN",["InvalidOperation"]])
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 |
|---|---|---|---|
| tie odd | ['1.26', ['Inexact', 'Rounded']] | ['1.26', ['Inexact', 'Rounded']] | Passed |
| tie even | ['1.24', ['Inexact', 'Rounded']] | ['1.24', ['Inexact', 'Rounded']] | Passed |
| rounded exact | ['1.20', ['Rounded']] | ['1.20', ['Rounded']] | Passed |
| already exact | ['1.20', []] | ['1.20', []] | Passed |
| one excess digit | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
| coefficient too large | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
| subnormal exact | ['1E-10', ['Subnormal']] | ['1E-10', ['Subnormal']] | Passed |
| negative zero | ['-0.00', ['Inexact', 'Rounded']] | ['-0.00', ['Inexact', 'Rounded']] | Passed |
| positive zero | ['0.00', ['Inexact', 'Rounded']] | ['0.00', ['Inexact', 'Rounded']] | Passed |
| integer quantum | ['1.2E+2', ['Inexact', 'Rounded']] | ['1.2E+2', ['Inexact', 'Rounded']] | Passed |
| overflow exponent | ['NaN', ['InvalidOperation']] | ['NaN', ['InvalidOperation']] | Passed |
SHA-256 / 460468a042fcf6d67d4cb763ba48f3f98f817466899bf87246a676393d0e8269
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:40.922447+00:00.
Case digest / 33abcd205842dd4ba5648612a11066a670a465c6dad04723dbd5b31d9f64446f