FA-17221 / Floating-point arithmetic / Open access
Scaled square root clamps a negative operand to zero · case 01
Scaled square root clamps a negative operand to zero.
ROOT CAUSE
Scaled square root clamps a negative operand to zero. The faulty expression is if x<0: return '0'.
VERIFIED REPAIR
Apply the contract at this fault site using if x<0: return 'domain'.
Unsuccessful approach: The attempted local correction if x<0: x=abs(x) still violates the explicit regression fixtures.
Case contract
Nonnegative square root of finite binary64 x via exponent normalization. Negative input returns domain; negative zero is preserved. Finite results are rendered to eleven significant decimal digits; modeled domain violations and arithmetic errors are explicit strings.
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
def render(x):
if math.isnan(x): return 'nan'
if math.isinf(x): return '-infinity' if x<0 else '+infinity'
return format(x,'.11g')
N = 1
observations = []
def solve(x):
try:
if x<0: return '0'
if x==0: return render(x)
m,e=math.frexp(x)
q,r=divmod(e,2)
root=math.sqrt(math.ldexp(m,r))
return render(math.ldexp(root,q))
except (ValueError, OverflowError, ZeroDivisionError, TypeError):
return "arithmetic-error"
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('square', solve(float(N*N)), render(float(N)))
check('normal', solve(float(N)), render(math.sqrt(N)))
check('huge', solve(1e300), "1e+150")
check('tiny', solve(1e-300), "1e-150")
check('odd exponent', solve(2.0), render(math.sqrt(2)))
check('positive root zero', solve(0.0), "0")
check('negative domain', solve(-float(N)), "domain")
check('negative zero', solve(-0.0), "-0")
check('subnormal', solve(math.ldexp(1.0,-1074)), render(math.ldexp(1.0,-537)))
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 |
|---|---|---|---|
| square | 1 | 1 | Passed |
| normal | 1 | 1 | Passed |
| huge | 1e+150 | 1e+150 | Passed |
| tiny | 1e-150 | 1e-150 | Passed |
| odd exponent | 1.4142135624 | 1.4142135624 | Passed |
| positive root zero | 0 | 0 | Passed |
| negative domain | 0 | domain | Failed |
| negative zero | -0 | -0 | Passed |
| subnormal | 2.2227587495e-162 | 2.2227587495e-162 | Passed |
SHA-256 / 88e32b29505ac97e30114d6352852739f4a66e526b02dc5570de4d38809582bd
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
import struct
def render(x):
if math.isnan(x): return 'nan'
if math.isinf(x): return '-infinity' if x<0 else '+infinity'
return format(x,'.11g')
N = 1
observations = []
def solve(x):
try:
if x<0: x=abs(x)
if x==0: return render(x)
m,e=math.frexp(x)
q,r=divmod(e,2)
root=math.sqrt(math.ldexp(m,r))
return render(math.ldexp(root,q))
except (ValueError, OverflowError, ZeroDivisionError, TypeError):
return "arithmetic-error"
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('square', solve(float(N*N)), render(float(N)))
check('normal', solve(float(N)), render(math.sqrt(N)))
check('huge', solve(1e300), "1e+150")
check('tiny', solve(1e-300), "1e-150")
check('odd exponent', solve(2.0), render(math.sqrt(2)))
check('positive root zero', solve(0.0), "0")
check('negative domain', solve(-float(N)), "domain")
check('negative zero', solve(-0.0), "-0")
check('subnormal', solve(math.ldexp(1.0,-1074)), render(math.ldexp(1.0,-537)))
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 |
|---|---|---|---|
| square | 1 | 1 | Passed |
| normal | 1 | 1 | Passed |
| huge | 1e+150 | 1e+150 | Passed |
| tiny | 1e-150 | 1e-150 | Passed |
| odd exponent | 1.4142135624 | 1.4142135624 | Passed |
| positive root zero | 0 | 0 | Passed |
| negative domain | 1 | domain | Failed |
| negative zero | -0 | -0 | Passed |
| subnormal | 2.2227587495e-162 | 2.2227587495e-162 | Passed |
SHA-256 / 33755f8b821ca7be3c330defa157dd8f06c240335425aaa4443f80fc59c00adf
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
import struct
def render(x):
if math.isnan(x): return 'nan'
if math.isinf(x): return '-infinity' if x<0 else '+infinity'
return format(x,'.11g')
N = 1
observations = []
def solve(x):
try:
if x<0: return 'domain'
if x==0: return render(x)
m,e=math.frexp(x)
q,r=divmod(e,2)
root=math.sqrt(math.ldexp(m,r))
return render(math.ldexp(root,q))
except (ValueError, OverflowError, ZeroDivisionError, TypeError):
return "arithmetic-error"
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('square', solve(float(N*N)), render(float(N)))
check('normal', solve(float(N)), render(math.sqrt(N)))
check('huge', solve(1e300), "1e+150")
check('tiny', solve(1e-300), "1e-150")
check('odd exponent', solve(2.0), render(math.sqrt(2)))
check('positive root zero', solve(0.0), "0")
check('negative domain', solve(-float(N)), "domain")
check('negative zero', solve(-0.0), "-0")
check('subnormal', solve(math.ldexp(1.0,-1074)), render(math.ldexp(1.0,-537)))
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 |
|---|---|---|---|
| square | 1 | 1 | Passed |
| normal | 1 | 1 | Passed |
| huge | 1e+150 | 1e+150 | Passed |
| tiny | 1e-150 | 1e-150 | Passed |
| odd exponent | 1.4142135624 | 1.4142135624 | Passed |
| positive root zero | 0 | 0 | Passed |
| negative domain | domain | domain | Passed |
| negative zero | -0 | -0 | Passed |
| subnormal | 2.2227587495e-162 | 2.2227587495e-162 | Passed |
SHA-256 / a2be440e40877a8ca6d5cbe5e4d7abbf5c9581a86035cddc86c6c1bf1b225c3e
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:44.233745+00:00.
Case digest / 68288e084bc9bbf481d7fa441d08ad368340bd1477eac03030d0d0511fc4e2c1