{"abstract":"Inverse sine loses the sign in the magnitude branch.","category":"Floating-point arithmetic","checks":7,"contract":"Evaluate inverse hyperbolic sine for finite binary64 values with tiny-value preservation and a large-value logarithmic branch. Finite results are rendered to eleven significant decimal digits; modeled domain violations and arithmetic errors are explicit strings.","evaluation_group":"s3-float-asinh-stable","failed_approach":"The attempted local correction return render(-result) still violates the explicit regression fixtures.","family":"s3-floating_point_arithmetic-asinh-stable-odd-symmetry","id":"FA-16251","implementations":{"attempt":{"sha256":"e02300a660326a89a7cb18b4a2dde31ee3f600a60b9e9dd5970eae320e260326","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nimport struct\ndef render(x):\n    if math.isnan(x): return 'nan'\n    if math.isinf(x): return '-infinity' if x<0 else '+infinity'\n    return format(x,'.11g')\n\nN = 1\nobservations = []\ndef solve(x):\n    try:\n        a=abs(x)\n        if a<1e-8: return render(x)\n        if a>1e150:\n            result=math.log(a)+math.log(2)\n        else:\n            result=math.log1p(a+a*a/(1+math.sqrt(1+a*a)))\n        return render(-result)\n    except (ValueError, OverflowError, ZeroDivisionError, TypeError):\n        return \"arithmetic-error\"\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('tiny', solve(N*2.0**-60), render(N*2.0**-60))\ncheck('negative tiny', solve(-N*2.0**-60), render(-N*2.0**-60))\ncheck('large', solve(N*1e300), render(math.asinh(N*1e300)))\ncheck('negative large', solve(-N*1e300), render(math.asinh(-N*1e300)))\ncheck('normal', solve(float(N)), render(math.asinh(N)))\ncheck('negative normal', solve(-float(N)), render(math.asinh(-N)))\ncheck('negative zero', solve(-0.0), \"-0\")\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"72ff425477f434772d1059b3ead6055c93b3bf8eed6f150e927af0b79a2b1637","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nimport struct\ndef render(x):\n    if math.isnan(x): return 'nan'\n    if math.isinf(x): return '-infinity' if x<0 else '+infinity'\n    return format(x,'.11g')\n\nN = 1\nobservations = []\ndef solve(x):\n    try:\n        a=abs(x)\n        if a<1e-8: return render(x)\n        if a>1e150:\n            result=math.log(a)+math.log(2)\n        else:\n            result=math.log1p(a+a*a/(1+math.sqrt(1+a*a)))\n        return render(result)\n    except (ValueError, OverflowError, ZeroDivisionError, TypeError):\n        return \"arithmetic-error\"\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('tiny', solve(N*2.0**-60), render(N*2.0**-60))\ncheck('negative tiny', solve(-N*2.0**-60), render(-N*2.0**-60))\ncheck('large', solve(N*1e300), render(math.asinh(N*1e300)))\ncheck('negative large', solve(-N*1e300), render(math.asinh(-N*1e300)))\ncheck('normal', solve(float(N)), render(math.asinh(N)))\ncheck('negative normal', solve(-float(N)), render(math.asinh(-N)))\ncheck('negative zero', solve(-0.0), \"-0\")\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"63b2caefba5e573952c603b31c9fbd968c653bd31fa97b5a6acc0ceaedc2a138","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nimport struct\ndef render(x):\n    if math.isnan(x): return 'nan'\n    if math.isinf(x): return '-infinity' if x<0 else '+infinity'\n    return format(x,'.11g')\n\nN = 1\nobservations = []\ndef solve(x):\n    try:\n        a=abs(x)\n        if a<1e-8: return render(x)\n        if a>1e150:\n            result=math.log(a)+math.log(2)\n        else:\n            result=math.log1p(a+a*a/(1+math.sqrt(1+a*a)))\n        return render(math.copysign(result,x))\n    except (ValueError, OverflowError, ZeroDivisionError, TypeError):\n        return \"arithmetic-error\"\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('tiny', solve(N*2.0**-60), render(N*2.0**-60))\ncheck('negative tiny', solve(-N*2.0**-60), render(-N*2.0**-60))\ncheck('large', solve(N*1e300), render(math.asinh(N*1e300)))\ncheck('negative large', solve(-N*1e300), render(math.asinh(-N*1e300)))\ncheck('normal', solve(float(N)), render(math.asinh(N)))\ncheck('negative normal', solve(-float(N)), render(math.asinh(-N)))\ncheck('negative zero', solve(-0.0), \"-0\")\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-floating_point_arithmetic-asinh-stable-odd-symmetry","generated_at":"2026-09-29T14:39:34.705045+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline floating representation model isolates a reproducible arithmetic fault.","repair":"Apply the contract at this fault site using return render(math.copysign(result,x)).","root_cause":"Inverse sine loses the sign in the magnitude branch. The faulty expression is return render(result).","sha256":"023972ca084627de360874c23daea38142b387e6d7f11f951ed7be1356f7009b","title":"Inverse sine loses the sign in the magnitude branch · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.941,"exit_code":1,"observations":[{"actual":"8.6736173799e-19","check":"tiny","expected":"8.6736173799e-19","passed":true},{"actual":"-8.6736173799e-19","check":"negative tiny","expected":"-8.6736173799e-19","passed":true},{"actual":"-691.46867508","check":"large","expected":"691.46867508","passed":false},{"actual":"-691.46867508","check":"negative large","expected":"-691.46867508","passed":true},{"actual":"-0.88137358702","check":"normal","expected":"0.88137358702","passed":false},{"actual":"-0.88137358702","check":"negative normal","expected":"-0.88137358702","passed":true},{"actual":"-0","check":"negative zero","expected":"-0","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tiny\", \"actual\": \"8.6736173799e-19\", \"expected\": \"8.6736173799e-19\", \"passed\": true}, {\"check\": \"negative tiny\", \"actual\": \"-8.6736173799e-19\", \"expected\": \"-8.6736173799e-19\", \"passed\": true}, {\"check\": \"large\", \"actual\": \"-691.46867508\", \"expected\": \"691.46867508\", \"passed\": false}, {\"check\": \"negative large\", \"actual\": \"-691.46867508\", \"expected\": \"-691.46867508\", \"passed\": true}, {\"check\": \"normal\", \"actual\": \"-0.88137358702\", \"expected\": \"0.88137358702\", \"passed\": false}, {\"check\": \"negative normal\", \"actual\": \"-0.88137358702\", \"expected\": \"-0.88137358702\", \"passed\": true}, {\"check\": \"negative zero\", \"actual\": \"-0\", \"expected\": \"-0\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.208,"exit_code":1,"observations":[{"actual":"8.6736173799e-19","check":"tiny","expected":"8.6736173799e-19","passed":true},{"actual":"-8.6736173799e-19","check":"negative tiny","expected":"-8.6736173799e-19","passed":true},{"actual":"691.46867508","check":"large","expected":"691.46867508","passed":true},{"actual":"691.46867508","check":"negative large","expected":"-691.46867508","passed":false},{"actual":"0.88137358702","check":"normal","expected":"0.88137358702","passed":true},{"actual":"0.88137358702","check":"negative normal","expected":"-0.88137358702","passed":false},{"actual":"-0","check":"negative zero","expected":"-0","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tiny\", \"actual\": \"8.6736173799e-19\", \"expected\": \"8.6736173799e-19\", \"passed\": true}, {\"check\": \"negative tiny\", \"actual\": \"-8.6736173799e-19\", \"expected\": \"-8.6736173799e-19\", \"passed\": true}, {\"check\": \"large\", \"actual\": \"691.46867508\", \"expected\": \"691.46867508\", \"passed\": true}, {\"check\": \"negative large\", \"actual\": \"691.46867508\", \"expected\": \"-691.46867508\", \"passed\": false}, {\"check\": \"normal\", \"actual\": \"0.88137358702\", \"expected\": \"0.88137358702\", \"passed\": true}, {\"check\": \"negative normal\", \"actual\": \"0.88137358702\", \"expected\": \"-0.88137358702\", \"passed\": false}, {\"check\": \"negative zero\", \"actual\": \"-0\", \"expected\": \"-0\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.675,"exit_code":0,"observations":[{"actual":"8.6736173799e-19","check":"tiny","expected":"8.6736173799e-19","passed":true},{"actual":"-8.6736173799e-19","check":"negative tiny","expected":"-8.6736173799e-19","passed":true},{"actual":"691.46867508","check":"large","expected":"691.46867508","passed":true},{"actual":"-691.46867508","check":"negative large","expected":"-691.46867508","passed":true},{"actual":"0.88137358702","check":"normal","expected":"0.88137358702","passed":true},{"actual":"-0.88137358702","check":"negative normal","expected":"-0.88137358702","passed":true},{"actual":"-0","check":"negative zero","expected":"-0","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tiny\", \"actual\": \"8.6736173799e-19\", \"expected\": \"8.6736173799e-19\", \"passed\": true}, {\"check\": \"negative tiny\", \"actual\": \"-8.6736173799e-19\", \"expected\": \"-8.6736173799e-19\", \"passed\": true}, {\"check\": \"large\", \"actual\": \"691.46867508\", \"expected\": \"691.46867508\", \"passed\": true}, {\"check\": \"negative large\", \"actual\": \"-691.46867508\", \"expected\": \"-691.46867508\", \"passed\": true}, {\"check\": \"normal\", \"actual\": \"0.88137358702\", \"expected\": \"0.88137358702\", \"passed\": true}, {\"check\": \"negative normal\", \"actual\": \"-0.88137358702\", \"expected\": \"-0.88137358702\", \"passed\": true}, {\"check\": \"negative zero\", \"actual\": \"-0\", \"expected\": \"-0\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}