feat: add benchmark-programs — 58 telecom COBOL test programs

作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
NB-076
2026-06-25 09:53:21 +08:00
parent 50f9f0f52f
commit 94400d50d4
278 changed files with 44125 additions and 0 deletions
@@ -0,0 +1,202 @@
IDENTIFICATION DIVISION.
*> PROGRAM-ID: NumPrecTest
*> Cross-cutting: Numeric precision and arithmetic
*> Tests: NP-N001 through NP-N007, NP-A001 through NP-A003
PROGRAM-ID. NumPrecTest.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 WS-DEC-A PIC 9(03)V99 VALUE 123.45.
77 WS-DEC-B PIC 9(03)V99 VALUE 67.89.
77 WS-DEC-SUM PIC 9(04)V99.
77 WS-DEC-SUM-DISP PIC 9(04)V99.
77 WS-ROUNDED PIC 9(03)V9.
77 WS-SIZE-A PIC 9(02) VALUE 99.
77 WS-SIZE-B PIC 9(02) VALUE 1.
77 WS-SIZE-RES PIC 9(02).
77 WS-DIVIDEND PIC 9(04) VALUE 1000.
77 WS-DIVISOR PIC 9(02) VALUE 3.
77 WS-QUOT PIC 9(04).
77 WS-REM PIC 9(02).
77 WS-COMP-SIGN PIC S9(04) USAGE COMP VALUE -1234.
77 WS-COMP-SIGN-OUT PIC S9(05).
77 WS-COMPUTE-RES PIC 9(10)V99.
77 WS-ZERO-DIV PIC 9(02) VALUE 0.
77 WS-TRAP-RES PIC 9(04).
77 TC PIC 99 VALUE 0.
PROCEDURE DIVISION.
*
* NP-N001: COMP-3 decimal alignment
*
NP-N001.
ADD 1 TO TC.
DISPLAY "NP-N001: COMP-3 decimal alignment".
COMPUTE WS-DEC-SUM = WS-DEC-A + WS-DEC-B.
MOVE WS-DEC-SUM TO WS-DEC-SUM-DISP.
IF WS-DEC-SUM-DISP = 191.34
DISPLAY " 123.45+67.89=" WS-DEC-SUM-DISP " OK"
ELSE
DISPLAY " 123.45+67.89=" WS-DEC-SUM-DISP " FAIL"
END-IF.
DISPLAY "NP-N001: PASS".
*
* NP-N002: ROUNDED option
*
NP-N002.
ADD 1 TO TC.
DISPLAY "NP-N002: ROUNDED option".
COMPUTE WS-ROUNDED ROUNDED = 10.0 / 3.0.
* 10/3 = 3.333..., ROUNDED to 1 decimal = 3.3
IF WS-ROUNDED = 3.3
DISPLAY " ROUNDED(10/3)=" WS-ROUNDED " OK"
ELSE
DISPLAY " ROUNDED(10/3)=" WS-ROUNDED " FAIL"
END-IF.
COMPUTE WS-ROUNDED ROUNDED = 10.0 / 6.0.
* 10/6 = 1.666..., ROUNDED to 1 decimal = 1.7
IF WS-ROUNDED = 1.7
DISPLAY " ROUNDED(10/6)=" WS-ROUNDED " OK"
ELSE
DISPLAY " ROUNDED(10/6)=" WS-ROUNDED " FAIL"
END-IF.
DISPLAY "NP-N002: PASS".
*
* NP-N003: ON SIZE ERROR
*
NP-N003.
ADD 1 TO TC.
DISPLAY "NP-N003: ON SIZE ERROR".
MOVE 0 TO WS-SIZE-RES.
ADD WS-SIZE-A TO WS-SIZE-B
ON SIZE ERROR
DISPLAY " SIZE ERROR TRAPPED (99+1=100 > 2 digits)"
NOT ON SIZE ERROR
DISPLAY " SIZE ERROR NOT RAISED"
END-ADD.
ADD WS-SIZE-B TO WS-SIZE-B
ON SIZE ERROR
DISPLAY " SIZE ERROR 2 TRAPPED"
NOT ON SIZE ERROR
DISPLAY " SIZE ERROR 2 NOT RAISED"
END-ADD.
DISPLAY "NP-N003: PASS".
*
* NP-N004: DIVIDE REMAINDER
*
NP-N004.
ADD 1 TO TC.
DISPLAY "NP-N004: DIVIDE REMAINDER".
DIVIDE WS-DIVIDEND BY WS-DIVISOR
GIVING WS-QUOT REMAINDER WS-REM.
IF WS-QUOT = 333 AND WS-REM = 1
DISPLAY " 1000/3 Q=" WS-QUOT " R=" WS-REM " OK"
ELSE
DISPLAY " 1000/3 Q=" WS-QUOT " R=" WS-REM " FAIL"
END-IF.
DIVIDE 100 BY 7
GIVING WS-QUOT REMAINDER WS-REM.
IF WS-QUOT = 14 AND WS-REM = 2
DISPLAY " 100/7 Q=" WS-QUOT " R=" WS-REM " OK"
ELSE
DISPLAY " 100/7 Q=" WS-QUOT " R=" WS-REM " FAIL"
END-IF.
DISPLAY "NP-N004: PASS".
*
* NP-N005: COMP binary sign
*
NP-N005.
ADD 1 TO TC.
DISPLAY "NP-N005: COMP binary sign".
MOVE WS-COMP-SIGN TO WS-COMP-SIGN-OUT.
IF WS-COMP-SIGN-OUT = -1234
DISPLAY " COMP SIGN -1234=" WS-COMP-SIGN-OUT " OK"
ELSE
DISPLAY " COMP SIGN -1234=" WS-COMP-SIGN-OUT " FAIL"
END-IF.
MOVE 0 TO WS-COMP-SIGN.
MOVE -32768 TO WS-COMP-SIGN.
MOVE WS-COMP-SIGN TO WS-COMP-SIGN-OUT.
IF WS-COMP-SIGN-OUT = -32768
DISPLAY " COMP MIN -32768=" WS-COMP-SIGN-OUT " OK"
ELSE
DISPLAY " COMP MIN -32768=" WS-COMP-SIGN-OUT " FAIL"
END-IF.
DISPLAY "NP-N005: PASS".
*
* NP-N006: COMPUTE intermediate precision
*
NP-N006.
ADD 1 TO TC.
DISPLAY "NP-N006: COMPUTE intermediate precision".
COMPUTE WS-COMPUTE-RES = 1234567890.99 + 0.01.
IF WS-COMPUTE-RES = 1234567891.00
DISPLAY " BIG DECIMAL SUM=" WS-COMPUTE-RES " OK"
ELSE
DISPLAY " BIG DECIMAL SUM=" WS-COMPUTE-RES " FAIL"
END-IF.
COMPUTE WS-COMPUTE-RES = 9999999999.99 / 3.
DISPLAY " 9999999999.99/3=" WS-COMPUTE-RES.
DISPLAY "NP-N006: PASS".
*
* NP-N007: Zero divide (ON SIZE ERROR trap)
*
NP-N007.
ADD 1 TO TC.
DISPLAY "NP-N007: Zero divide trap".
MOVE 0 TO WS-TRAP-RES.
DIVIDE 100 BY WS-ZERO-DIV
GIVING WS-TRAP-RES
ON SIZE ERROR
DISPLAY " ZERO DIVIDE TRAPPED OK"
NOT ON SIZE ERROR
DISPLAY " ZERO DIVIDE NOT TRAPPED FAIL"
END-DIVIDE.
DISPLAY "NP-N007: PASS".
*
* NP-A001: Complex decimal expression
*
NP-A001.
ADD 1 TO TC.
DISPLAY "NP-A001: Complex decimal expression".
COMPUTE WS-DEC-SUM ROUNDED =
(WS-DEC-A * 2.5) / (WS-DEC-B + 0.5).
* 123.45 * 2.5 = 308.625
* 67.89 + 0.5 = 68.39
* 308.625 / 68.39 = 4.5127... -> 4.51 (V99)
MOVE WS-DEC-SUM TO WS-DEC-SUM-DISP.
DISPLAY " COMPLEX EXPR=" WS-DEC-SUM-DISP.
DISPLAY "NP-A001: PASS".
*
* NP-A002: ON SIZE ERROR with COMPUTE
*
NP-A002.
ADD 1 TO TC.
DISPLAY "NP-A002: ON SIZE ERROR with COMPUTE".
COMPUTE WS-SIZE-RES = 50 + 60
ON SIZE ERROR
DISPLAY " COMPUTE SIZE ERROR 110>99 TRAPPED"
NOT ON SIZE ERROR
DISPLAY " COMPUTE SIZE ERROR NOT RAISED"
END-COMPUTE.
DISPLAY "NP-A002: PASS".
*
* NP-A003: Mixed arithmetic operations
*
NP-A003.
ADD 1 TO TC.
DISPLAY "NP-A003: Mixed arithmetic".
COMPUTE WS-DEC-SUM = (10 + 20) * 3 - 15 / 3.
* 10+20=30, 30*3=90, 15/3=5, 90-5=85
MOVE WS-DEC-SUM TO WS-DEC-SUM-DISP.
IF WS-DEC-SUM-DISP = 85.00
DISPLAY " MIXED ARITH=" WS-DEC-SUM-DISP " OK"
ELSE
DISPLAY " MIXED ARITH=" WS-DEC-SUM-DISP " FAIL"
END-IF.
DISPLAY "NP-A003: PASS".
*
* Summary
*
END-TEST.
DISPLAY "NUMERIC-PRECISION: ALL " TC " TESTS DONE".
STOP RUN.