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.