{"abstract":"Stochastic rounding adds upward in numeric order after sign application.","category":"Floating-point arithmetic","checks":10,"contract":"Stipulated stochastic rounding of nonnegative significand with exact dyadic remainder rem/2**k. Draw is uniform integer in [0,2**k); increment magnitude iff draw<rem, then apply sign. Exact results never increment. Return rounded value and whether magnitude incremented.","evaluation_group":"s3-float-stochastic-round","failed_approach":"The attempted local correction return [sign*q-int(inc),inc] still violates the explicit regression fixtures.","family":"s3-floating_point_arithmetic-stochastic-round-negative-step","id":"FA-16661","implementations":{"attempt":{"sha256":"d2b0ef95a76536edbb248547d17478ffc33e532ae14ff116365159de3fe8ccbf","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nimport struct\nN = 1\nobservations = []\ndef solve(q,rem,k,draw,sign):\n    if k<0 or rem<0 or rem>=(1<<k) or draw<0 or draw>=(1<<k): return 'invalid'\n    if rem==0: return [sign*q,False]\n    inc=draw<rem\n    return [sign*q-int(inc),inc]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('draw below', solve(N,3,3,2,1), [N+1,True])\ncheck('draw equality', solve(N,3,3,3,1), [N,False])\ncheck('draw above', solve(N,3,3,7,1), [N,False])\ncheck('negative increment', solve(N,3,3,1,-1), [-N-1,True])\ncheck('negative no increment', solve(N,3,3,5,-1), [-N,False])\ncheck('exact', solve(N,0,3,0,1), [N,False])\ncheck('invalid remainder', solve(N,8,3,0,1), \"invalid\")\ncheck('invalid draw', solve(N,3,3,8,1), \"invalid\")\ncheck('large resolution', solve(N,1,54,0,1), [N+1,True])\ncheck('resolution boundary', solve(N,1,54,1,1), [N,False])\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":"62e37b2472060f75b60483d7f9bc8832bf97b3f919bfc9eede118212f9e8ea17","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nimport struct\nN = 1\nobservations = []\ndef solve(q,rem,k,draw,sign):\n    if k<0 or rem<0 or rem>=(1<<k) or draw<0 or draw>=(1<<k): return 'invalid'\n    if rem==0: return [sign*q,False]\n    inc=draw<rem\n    return [sign*q+int(inc),inc]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('draw below', solve(N,3,3,2,1), [N+1,True])\ncheck('draw equality', solve(N,3,3,3,1), [N,False])\ncheck('draw above', solve(N,3,3,7,1), [N,False])\ncheck('negative increment', solve(N,3,3,1,-1), [-N-1,True])\ncheck('negative no increment', solve(N,3,3,5,-1), [-N,False])\ncheck('exact', solve(N,0,3,0,1), [N,False])\ncheck('invalid remainder', solve(N,8,3,0,1), \"invalid\")\ncheck('invalid draw', solve(N,3,3,8,1), \"invalid\")\ncheck('large resolution', solve(N,1,54,0,1), [N+1,True])\ncheck('resolution boundary', solve(N,1,54,1,1), [N,False])\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":"74f7e37101b15188f374d172616fb946764e6cdc3d45d59d3c86cfa8ddcf5126","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nimport struct\nN = 1\nobservations = []\ndef solve(q,rem,k,draw,sign):\n    if k<0 or rem<0 or rem>=(1<<k) or draw<0 or draw>=(1<<k): return 'invalid'\n    if rem==0: return [sign*q,False]\n    inc=draw<rem\n    return [sign*(q+int(inc)),inc]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('draw below', solve(N,3,3,2,1), [N+1,True])\ncheck('draw equality', solve(N,3,3,3,1), [N,False])\ncheck('draw above', solve(N,3,3,7,1), [N,False])\ncheck('negative increment', solve(N,3,3,1,-1), [-N-1,True])\ncheck('negative no increment', solve(N,3,3,5,-1), [-N,False])\ncheck('exact', solve(N,0,3,0,1), [N,False])\ncheck('invalid remainder', solve(N,8,3,0,1), \"invalid\")\ncheck('invalid draw', solve(N,3,3,8,1), \"invalid\")\ncheck('large resolution', solve(N,1,54,0,1), [N+1,True])\ncheck('resolution boundary', solve(N,1,54,1,1), [N,False])\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-stochastic-round-negative-step","generated_at":"2026-09-29T14:39:38.566907+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 [sign*(q+int(inc)),inc].","root_cause":"Stochastic rounding adds upward in numeric order after sign application. The faulty expression is return [sign*q+int(inc),inc].","sha256":"aeca8644bbc0467cc7cb32323dc080bed7f19e86b650e7df7020121725d4aef8","title":"Stochastic rounding adds upward in numeric order after sign application · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.624,"exit_code":1,"observations":[{"actual":[0,true],"check":"draw below","expected":[2,true],"passed":false},{"actual":[1,false],"check":"draw equality","expected":[1,false],"passed":true},{"actual":[1,false],"check":"draw above","expected":[1,false],"passed":true},{"actual":[-2,true],"check":"negative increment","expected":[-2,true],"passed":true},{"actual":[-1,false],"check":"negative no increment","expected":[-1,false],"passed":true},{"actual":[1,false],"check":"exact","expected":[1,false],"passed":true},{"actual":"invalid","check":"invalid remainder","expected":"invalid","passed":true},{"actual":"invalid","check":"invalid draw","expected":"invalid","passed":true},{"actual":[0,true],"check":"large resolution","expected":[2,true],"passed":false},{"actual":[1,false],"check":"resolution boundary","expected":[1,false],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"draw below\", \"actual\": [0, true], \"expected\": [2, true], \"passed\": false}, {\"check\": \"draw equality\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"draw above\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"negative increment\", \"actual\": [-2, true], \"expected\": [-2, true], \"passed\": true}, {\"check\": \"negative no increment\", \"actual\": [-1, false], \"expected\": [-1, false], \"passed\": true}, {\"check\": \"exact\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"invalid remainder\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"invalid draw\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"large resolution\", \"actual\": [0, true], \"expected\": [2, true], \"passed\": false}, {\"check\": \"resolution boundary\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.956,"exit_code":1,"observations":[{"actual":[2,true],"check":"draw below","expected":[2,true],"passed":true},{"actual":[1,false],"check":"draw equality","expected":[1,false],"passed":true},{"actual":[1,false],"check":"draw above","expected":[1,false],"passed":true},{"actual":[0,true],"check":"negative increment","expected":[-2,true],"passed":false},{"actual":[-1,false],"check":"negative no increment","expected":[-1,false],"passed":true},{"actual":[1,false],"check":"exact","expected":[1,false],"passed":true},{"actual":"invalid","check":"invalid remainder","expected":"invalid","passed":true},{"actual":"invalid","check":"invalid draw","expected":"invalid","passed":true},{"actual":[2,true],"check":"large resolution","expected":[2,true],"passed":true},{"actual":[1,false],"check":"resolution boundary","expected":[1,false],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"draw below\", \"actual\": [2, true], \"expected\": [2, true], \"passed\": true}, {\"check\": \"draw equality\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"draw above\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"negative increment\", \"actual\": [0, true], \"expected\": [-2, true], \"passed\": false}, {\"check\": \"negative no increment\", \"actual\": [-1, false], \"expected\": [-1, false], \"passed\": true}, {\"check\": \"exact\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"invalid remainder\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"invalid draw\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"large resolution\", \"actual\": [2, true], \"expected\": [2, true], \"passed\": true}, {\"check\": \"resolution boundary\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.247,"exit_code":0,"observations":[{"actual":[2,true],"check":"draw below","expected":[2,true],"passed":true},{"actual":[1,false],"check":"draw equality","expected":[1,false],"passed":true},{"actual":[1,false],"check":"draw above","expected":[1,false],"passed":true},{"actual":[-2,true],"check":"negative increment","expected":[-2,true],"passed":true},{"actual":[-1,false],"check":"negative no increment","expected":[-1,false],"passed":true},{"actual":[1,false],"check":"exact","expected":[1,false],"passed":true},{"actual":"invalid","check":"invalid remainder","expected":"invalid","passed":true},{"actual":"invalid","check":"invalid draw","expected":"invalid","passed":true},{"actual":[2,true],"check":"large resolution","expected":[2,true],"passed":true},{"actual":[1,false],"check":"resolution boundary","expected":[1,false],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"draw below\", \"actual\": [2, true], \"expected\": [2, true], \"passed\": true}, {\"check\": \"draw equality\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"draw above\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"negative increment\", \"actual\": [-2, true], \"expected\": [-2, true], \"passed\": true}, {\"check\": \"negative no increment\", \"actual\": [-1, false], \"expected\": [-1, false], \"passed\": true}, {\"check\": \"exact\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}, {\"check\": \"invalid remainder\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"invalid draw\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"large resolution\", \"actual\": [2, true], \"expected\": [2, true], \"passed\": true}, {\"check\": \"resolution boundary\", \"actual\": [1, false], \"expected\": [1, false], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}