IDENTIFICATION DIVISION. PROGRAM-ID. NumericEdge. *> ============================================================ *> 数値演算境界テスト (Numeric Boundary Edge Cases) *> COMP-3 無効サインニブル, SIZE ERROR境界, *> ROUNDED境界(0.5, 0.99), 桁あふれ, 符号なし/符号付混算 *> Coverage: NP-N001~N007, NP-A001~A004 拡張 *> ============================================================ DATA DIVISION. WORKING-STORAGE SECTION. *> COMP-3 サインニブル検証 01 WS-C3-POS PIC S9(5) USAGE COMP-3 VALUE 12345. 01 WS-C3-NEG PIC S9(5) USAGE COMP-3 VALUE -12345. 01 WS-C3-ZERO PIC S9(5) USAGE COMP-3 VALUE 0. 01 WS-C3-BIG PIC S9(9) USAGE COMP-3 VALUE 999999999. 01 WS-C3-DISP PIC S9(5). *> SIZE ERROR境界 01 WS-SE-A PIC 9(2) VALUE 99. 01 WS-SE-B PIC 9(2) VALUE 1. 01 WS-SE-C PIC 9(2) VALUE 99. 01 WS-SE-RES PIC 9(2). *> ROUNDED境界 01 WS-RD1 PIC 9(2)V9 VALUE 0. 01 WS-RD2 PIC 9(2)V99 VALUE 0. 01 WS-RD-SRC1 PIC 9(3)V99 VALUE 999.995. 01 WS-RD-SRC2 PIC 9(3)V99 VALUE 999.994. 01 WS-RD-SRC3 PIC 9(3)V99 VALUE 100.050. 01 WS-RD-SRC4 PIC 9(3)V99 VALUE 100.049. *> 桁あふれ 01 WS-OF-A PIC 9(5) VALUE 99999. 01 WS-OF-B PIC 9(5) VALUE 1. 01 WS-OF-RES PIC 9(5). *> 符号なし/符号付混算 01 WS-UNSIGNED PIC 9(5) VALUE 100. 01 WS-SIGNED PIC S9(5) VALUE -200. 01 WS-MIX-RES PIC S9(6). *> ゼロ除算トラップ 01 WS-ZD-DIV PIC 9(5) VALUE 100. 01 WS-ZD-DIVISOR PIC 9(5) VALUE 0. 01 WS-ZD-RES PIC 9(5). 01 WS-PASS PIC 9(2) VALUE 0. 01 WS-FAIL PIC 9(2) VALUE 0. 01 WS-TC PIC 9(2) VALUE 0. 01 WS-VAL PIC 9(5). PROCEDURE DIVISION. MAIN. DISPLAY "NUMERIC-EDGE: Numeric boundary edge tests" *> T1: COMP-3 sign nibble (positive/negative/zero) ADD 1 TO WS-TC. MOVE WS-C3-POS TO WS-C3-DISP. IF WS-C3-DISP = 12345 DISPLAY "T1-C3-POS: 12345→" WS-C3-DISP " PASS" ADD 1 TO WS-PASS ELSE ADD 1 TO WS-FAIL END-IF. ADD 1 TO WS-TC. MOVE WS-C3-NEG TO WS-C3-DISP. IF WS-C3-DISP = -12345 DISPLAY "T1-C3-NEG: -12345→" WS-C3-DISP " PASS" ADD 1 TO WS-PASS ELSE ADD 1 TO WS-FAIL END-IF. ADD 1 TO WS-TC. MOVE WS-C3-ZERO TO WS-C3-DISP. IF WS-C3-DISP = 0 DISPLAY "T1-C3-ZERO: 0→" WS-C3-DISP " PASS" ADD 1 TO WS-PASS ELSE ADD 1 TO WS-FAIL END-IF. *> T2: SIZE ERROR境界 ADD 1 TO WS-TC. ADD WS-SE-A TO WS-SE-B ON SIZE ERROR DISPLAY "T2-SE: 99+1=100 > 99 SIZE ERROR PASS" ADD 1 TO WS-PASS NOT ON SIZE ERROR ADD 1 TO WS-FAIL END-ADD. *> 正常範囲: 1+98=99 ADD 1 TO WS-TC. MOVE 1 TO WS-SE-A. MOVE 98 TO WS-SE-C. ADD WS-SE-A TO WS-SE-C GIVING WS-SE-RES ON SIZE ERROR ADD 1 TO WS-FAIL NOT ON SIZE ERROR IF WS-SE-RES = 99 DISPLAY "T2-SE-NORM: 1+98=99 PASS" ADD 1 TO WS-PASS ELSE ADD 1 TO WS-FAIL END-IF END-ADD. *> T3: ROUNDED境界 ADD 1 TO WS-TC. COMPUTE WS-RD1 ROUNDED = WS-RD-SRC1. IF WS-RD1 = 1000.0 DISPLAY "T3-RD1: 999.995 rounded→1000.0 PASS" ADD 1 TO WS-PASS ELSE DISPLAY "T3-RD1: " WS-RD1 " FAIL" ADD 1 TO WS-FAIL END-IF. ADD 1 TO WS-TC. COMPUTE WS-RD1 ROUNDED = WS-RD-SRC2. IF WS-RD1 = 999.9 DISPLAY "T3-RD2: 999.994→999.9 PASS" ADD 1 TO WS-PASS ELSE DISPLAY "T3-RD2: " WS-RD1 " FAIL" ADD 1 TO WS-FAIL END-IF. *> T4: 桁あふれ ADD 1 TO WS-TC. ADD WS-OF-A TO WS-OF-B GIVING WS-OF-RES ON SIZE ERROR DISPLAY "T4-OF: 99999+1 SIZE ERROR PASS" ADD 1 TO WS-PASS NOT ON SIZE ERROR ADD 1 TO WS-FAIL END-ADD. *> T5: 符号なし/符号付混算 ADD 1 TO WS-TC. COMPUTE WS-MIX-RES = WS-UNSIGNED + WS-SIGNED. IF WS-MIX-RES = -100 DISPLAY "T5-MIX: 100 + (-200) = -100 PASS" ADD 1 TO WS-PASS ELSE ADD 1 TO WS-FAIL END-IF. *> T6: ゼロ除算トラップ ADD 1 TO WS-TC. DIVIDE WS-ZD-DIV BY WS-ZD-DIVISOR GIVING WS-ZD-RES ON SIZE ERROR DISPLAY "T6-ZDIV: Zero divide SIZE ERROR PASS" ADD 1 TO WS-PASS NOT ON SIZE ERROR DISPLAY "T6-ZDIV: NOT TRAPPED FAIL" ADD 1 TO WS-FAIL END-DIVIDE. DISPLAY " " DISPLAY "NUMERIC-EDGE: PASS=" WS-PASS " FAIL=" WS-FAIL IF WS-FAIL = 0 DISPLAY "ALL PASSED" STOP RUN RETURNING 0 ELSE STOP RUN RETURNING 1 END-IF . END PROGRAM NumericEdge.