The MULTIPLY and END-MULTIPLY statements represent sophisticated arithmetic processing capabilities within COBOL programming environments, providing comprehensive multiplication operations, advanced error handling mechanisms, and intelligent numeric computation features that enable reliable mathematical calculations, efficient arithmetic processing, and robust exception management. These statements embody enterprise arithmetic principles by supporting flexible multiplication patterns, enabling precise numeric control, and facilitating comprehensive calculation requirements while maintaining computational accuracy, ensuring consistent arithmetic behavior, and enabling scalable mathematical processing across business applications requiring reliable multiplication operations, automated error detection, and predictable arithmetic results throughout complex financial and statistical computations.
1234567891011121314151617181920212223242526272829303132333435*> Format 1: MULTIPLY...GIVING MULTIPLY identifier-1 BY identifier-2 GIVING identifier-3 [ROUNDED] [ON SIZE ERROR imperative-statement] [NOT ON SIZE ERROR imperative-statement] [END-MULTIPLY]. *> Format 2: MULTIPLY...BY (in-place) MULTIPLY identifier-1 BY identifier-2 [ROUNDED] [ON SIZE ERROR imperative-statement] [NOT ON SIZE ERROR imperative-statement] [END-MULTIPLY]. *> Examples: *> Simple multiplication with GIVING MULTIPLY QUANTITY BY UNIT-PRICE GIVING TOTAL-COST. *> In-place multiplication MULTIPLY SALARY BY 1.05 END-MULTIPLY. *> With rounding and error handling MULTIPLY HOURS-WORKED BY HOURLY-RATE GIVING GROSS-PAY ROUNDED ON SIZE ERROR DISPLAY "Payroll calculation overflow" MOVE 999999.99 TO GROSS-PAY NOT ON SIZE ERROR DISPLAY "Payroll calculated: $" GROSS-PAY END-MULTIPLY. *> Multiple target fields MULTIPLY TAX-RATE BY INCOME GIVING FEDERAL-TAX ROUNDED STATE-TAX ROUNDED ON SIZE ERROR PERFORM HANDLE-TAX-OVERFLOW END-MULTIPLY.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332IDENTIFICATION DIVISION. PROGRAM-ID. MULTIPLY-OPERATIONS-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. *> Basic multiplication operands 01 WS-ARITHMETIC-FIELDS. 05 WS-MULTIPLICAND PIC 9(6)V99 VALUE 1234.56. 05 WS-MULTIPLIER PIC 9(4)V99 VALUE 7.25. 05 WS-PRODUCT PIC 9(8)V99. 05 WS-ROUNDED-PRODUCT PIC 9(8)V99. *> Business calculation fields 01 WS-PAYROLL-CALC. 05 WS-HOURS-WORKED PIC 9(3)V9 VALUE 40.5. 05 WS-HOURLY-RATE PIC 9(3)V99 VALUE 25.75. 05 WS-GROSS-PAY PIC 9(6)V99. 05 WS-OVERTIME-RATE PIC 9V99 VALUE 1.5. 05 WS-OVERTIME-PAY PIC 9(6)V99. *> Financial calculations 01 WS-FINANCIAL-FIELDS. 05 WS-PRINCIPAL PIC 9(8)V99 VALUE 50000.00. 05 WS-INTEREST-RATE PIC 9V9999 VALUE 0.0525. 05 WS-YEARS PIC 9(2) VALUE 5. 05 WS-ANNUAL-INTEREST PIC 9(8)V99. 05 WS-COMPOUND-FACTOR PIC 9V9999. *> Sales commission calculations 01 WS-SALES-COMMISSION. 05 WS-SALES-AMOUNT PIC 9(8)V99 VALUE 125000.00. 05 WS-COMMISSION-RATE PIC 9V9999 VALUE 0.0350. 05 WS-BASE-COMMISSION PIC 9(6)V99. 05 WS-BONUS-MULTIPLIER PIC 9V99 VALUE 1.25. 05 WS-TOTAL-COMMISSION PIC 9(6)V99. *> Inventory calculations 01 WS-INVENTORY-CALC. 05 WS-QUANTITY PIC 9(6) VALUE 500. 05 WS-UNIT-COST PIC 9(4)V99 VALUE 12.75. 05 WS-TOTAL-COST PIC 9(8)V99. 05 WS-MARKUP-PERCENTAGE PIC 9V99 VALUE 1.40. 05 WS-SELLING-PRICE PIC 9(6)V99. *> Error handling and status 01 WS-CALCULATION-STATUS. 05 WS-ERROR-FLAG PIC X VALUE 'N'. 05 WS-OPERATIONS-COUNT PIC 9(4) VALUE 0. 05 WS-SUCCESS-COUNT PIC 9(4) VALUE 0. 05 WS-ERROR-COUNT PIC 9(4) VALUE 0. *> Arrays for batch calculations 01 WS-BATCH-CALCULATIONS. 05 WS-PRICE-TABLE OCCURS 10 TIMES. 10 WS-ITEM-PRICE PIC 9(4)V99. 10 WS-QUANTITY-SOLD PIC 9(4). 10 WS-LINE-TOTAL PIC 9(6)V99. 05 WS-GRAND-TOTAL PIC 9(8)V99. PROCEDURE DIVISION. MAIN-MULTIPLY-DEMO. DISPLAY "=== COBOL MULTIPLY OPERATIONS DEMONSTRATION ===" DISPLAY SPACES PERFORM DEMONSTRATE-BASIC-MULTIPLY PERFORM DEMONSTRATE-PAYROLL-CALCULATIONS PERFORM DEMONSTRATE-FINANCIAL-CALCULATIONS PERFORM DEMONSTRATE-COMMISSION-CALCULATIONS PERFORM DEMONSTRATE-BATCH-MULTIPLY PERFORM DEMONSTRATE-ERROR-HANDLING PERFORM DISPLAY-CALCULATION-SUMMARY DISPLAY "=== MULTIPLY DEMO COMPLETE ===" STOP RUN. DEMONSTRATE-BASIC-MULTIPLY. DISPLAY "=== BASIC MULTIPLY OPERATIONS ===" DISPLAY SPACES DISPLAY "Basic multiplication examples:" *> Simple MULTIPLY...GIVING MULTIPLY WS-MULTIPLICAND BY WS-MULTIPLIER GIVING WS-PRODUCT ADD 1 TO WS-OPERATIONS-COUNT ADD 1 TO WS-SUCCESS-COUNT DISPLAY " " WS-MULTIPLICAND " × " WS-MULTIPLIER " = " WS-PRODUCT *> MULTIPLY with rounding MULTIPLY WS-MULTIPLICAND BY WS-MULTIPLIER GIVING WS-ROUNDED-PRODUCT ROUNDED ADD 1 TO WS-OPERATIONS-COUNT ADD 1 TO WS-SUCCESS-COUNT DISPLAY " Rounded result: " WS-ROUNDED-PRODUCT *> In-place multiplication MOVE 100.00 TO WS-MULTIPLICAND DISPLAY " Before in-place multiply: " WS-MULTIPLICAND MULTIPLY WS-MULTIPLICAND BY 1.15 END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT ADD 1 TO WS-SUCCESS-COUNT DISPLAY " After 15% increase: " WS-MULTIPLICAND DISPLAY SPACES. DEMONSTRATE-PAYROLL-CALCULATIONS. DISPLAY "=== PAYROLL CALCULATIONS ===" DISPLAY SPACES DISPLAY "Calculating employee payroll..." *> Regular pay calculation MULTIPLY WS-HOURS-WORKED BY WS-HOURLY-RATE GIVING WS-GROSS-PAY ROUNDED ON SIZE ERROR DISPLAY " ERROR: Gross pay calculation overflow" MOVE 'Y' TO WS-ERROR-FLAG ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Regular hours: " WS-HOURS-WORKED " @ $" WS-HOURLY-RATE DISPLAY " Gross pay: $" WS-GROSS-PAY ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT *> Overtime calculation IF WS-HOURS-WORKED > 40 COMPUTE WS-HOURS-WORKED = WS-HOURS-WORKED - 40 MULTIPLY WS-HOURS-WORKED BY WS-HOURLY-RATE BY WS-OVERTIME-RATE GIVING WS-OVERTIME-PAY ROUNDED ON SIZE ERROR DISPLAY " ERROR: Overtime calculation overflow" ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Overtime hours: " WS-HOURS-WORKED " @ 1.5x rate" DISPLAY " Overtime pay: $" WS-OVERTIME-PAY ADD WS-OVERTIME-PAY TO WS-GROSS-PAY ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT END-IF DISPLAY " Total gross pay: $" WS-GROSS-PAY DISPLAY SPACES. DEMONSTRATE-FINANCIAL-CALCULATIONS. DISPLAY "=== FINANCIAL CALCULATIONS ===" DISPLAY SPACES DISPLAY "Calculating investment returns..." *> Simple interest calculation MULTIPLY WS-PRINCIPAL BY WS-INTEREST-RATE GIVING WS-ANNUAL-INTEREST ROUNDED ON SIZE ERROR DISPLAY " ERROR: Interest calculation overflow" ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Principal: $" WS-PRINCIPAL DISPLAY " Interest rate: " WS-INTEREST-RATE " (5.25%)" DISPLAY " Annual interest: $" WS-ANNUAL-INTEREST ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT *> Compound interest factor calculation COMPUTE WS-COMPOUND-FACTOR = 1 + WS-INTEREST-RATE *> Multiple years compound calculation PERFORM VARYING WS-YEARS FROM 1 BY 1 UNTIL WS-YEARS > 5 MULTIPLY WS-PRINCIPAL BY WS-COMPOUND-FACTOR GIVING WS-PRINCIPAL ROUNDED ON SIZE ERROR DISPLAY " ERROR: Compound calculation overflow at year " WS-YEARS ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Year " WS-YEARS " value: $" WS-PRINCIPAL ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT END-PERFORM DISPLAY SPACES. DEMONSTRATE-COMMISSION-CALCULATIONS. DISPLAY "=== SALES COMMISSION CALCULATIONS ===" DISPLAY SPACES DISPLAY "Calculating sales commissions..." *> Base commission calculation MULTIPLY WS-SALES-AMOUNT BY WS-COMMISSION-RATE GIVING WS-BASE-COMMISSION ROUNDED ON SIZE ERROR DISPLAY " ERROR: Commission calculation overflow" ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Sales amount: $" WS-SALES-AMOUNT DISPLAY " Commission rate: " WS-COMMISSION-RATE " (3.5%)" DISPLAY " Base commission: $" WS-BASE-COMMISSION ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT *> Bonus commission calculation IF WS-SALES-AMOUNT > 100000 MULTIPLY WS-BASE-COMMISSION BY WS-BONUS-MULTIPLIER GIVING WS-TOTAL-COMMISSION ROUNDED ON SIZE ERROR DISPLAY " ERROR: Bonus calculation overflow" ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Bonus multiplier: " WS-BONUS-MULTIPLIER " (25% bonus)" DISPLAY " Total commission: $" WS-TOTAL-COMMISSION ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT ELSE MOVE WS-BASE-COMMISSION TO WS-TOTAL-COMMISSION DISPLAY " Total commission: $" WS-TOTAL-COMMISSION " (no bonus)" END-IF DISPLAY SPACES. DEMONSTRATE-BATCH-MULTIPLY. DISPLAY "=== BATCH MULTIPLICATION OPERATIONS ===" DISPLAY SPACES DISPLAY "Processing inventory line items..." *> Initialize sample data PERFORM INITIALIZE-PRICE-TABLE *> Process each line item PERFORM VARYING WS-INVENTORY-CALC FROM 1 BY 1 UNTIL WS-INVENTORY-CALC > 10 MULTIPLY WS-ITEM-PRICE(WS-INVENTORY-CALC) BY WS-QUANTITY-SOLD(WS-INVENTORY-CALC) GIVING WS-LINE-TOTAL(WS-INVENTORY-CALC) ROUNDED ON SIZE ERROR DISPLAY " ERROR: Line " WS-INVENTORY-CALC " calculation overflow" MOVE 999999.99 TO WS-LINE-TOTAL(WS-INVENTORY-CALC) ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Line " WS-INVENTORY-CALC ": " WS-QUANTITY-SOLD(WS-INVENTORY-CALC) " × $" WS-ITEM-PRICE(WS-INVENTORY-CALC) " = $" WS-LINE-TOTAL(WS-INVENTORY-CALC) ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT ADD WS-LINE-TOTAL(WS-INVENTORY-CALC) TO WS-GRAND-TOTAL END-PERFORM DISPLAY " Grand total: $" WS-GRAND-TOTAL DISPLAY SPACES. INITIALIZE-PRICE-TABLE. 01 WS-INIT-INDEX PIC 9(2) VALUE 0. 01 WS-BASE-PRICE PIC 9(4)V99 VALUE 10.00. 01 WS-BASE-QUANTITY PIC 9(4) VALUE 5. PERFORM VARYING WS-INIT-INDEX FROM 1 BY 1 UNTIL WS-INIT-INDEX > 10 COMPUTE WS-ITEM-PRICE(WS-INIT-INDEX) = WS-BASE-PRICE * WS-INIT-INDEX COMPUTE WS-QUANTITY-SOLD(WS-INIT-INDEX) = WS-BASE-QUANTITY * WS-INIT-INDEX MOVE 0 TO WS-LINE-TOTAL(WS-INIT-INDEX) END-PERFORM. DEMONSTRATE-ERROR-HANDLING. DISPLAY "=== ERROR HANDLING DEMONSTRATION ===" DISPLAY SPACES DISPLAY "Testing overflow conditions..." *> Test size error with large numbers MOVE 999999.99 TO WS-MULTIPLICAND MOVE 999999.99 TO WS-MULTIPLIER MULTIPLY WS-MULTIPLICAND BY WS-MULTIPLIER GIVING WS-PRODUCT ON SIZE ERROR DISPLAY " SIZE ERROR detected: " WS-MULTIPLICAND " × " WS-MULTIPLIER DISPLAY " Result would exceed field capacity" MOVE 0 TO WS-PRODUCT ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Large multiplication successful: " WS-PRODUCT ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT *> Test with decimal precision MOVE 123.456 TO WS-MULTIPLICAND MOVE 789.123 TO WS-MULTIPLIER MULTIPLY WS-MULTIPLICAND BY WS-MULTIPLIER GIVING WS-PRODUCT ROUNDED ON SIZE ERROR DISPLAY " Decimal precision error" ADD 1 TO WS-ERROR-COUNT NOT ON SIZE ERROR DISPLAY " Precision multiply: " WS-MULTIPLICAND " × " WS-MULTIPLIER " = " WS-PRODUCT ADD 1 TO WS-SUCCESS-COUNT END-MULTIPLY ADD 1 TO WS-OPERATIONS-COUNT DISPLAY SPACES. DISPLAY-CALCULATION-SUMMARY. DISPLAY "=== CALCULATION SUMMARY ===" DISPLAY SPACES DISPLAY "Multiplication operations completed:" DISPLAY " Total operations: " WS-OPERATIONS-COUNT DISPLAY " Successful: " WS-SUCCESS-COUNT DISPLAY " Errors: " WS-ERROR-COUNT IF WS-ERROR-COUNT > 0 COMPUTE WS-MULTIPLICAND = (WS-SUCCESS-COUNT / WS-OPERATIONS-COUNT) * 100 DISPLAY " Success rate: " WS-MULTIPLICAND "%" ELSE DISPLAY " Success rate: 100%" END-IF DISPLAY "MULTIPLY statement benefits:" DISPLAY " ✓ Built-in overflow detection" DISPLAY " ✓ Automatic rounding options" DISPLAY " ✓ Multiple target field support" DISPLAY " ✓ Structured error handling with END-MULTIPLY" DISPLAY " ✓ Efficient arithmetic operations" DISPLAY SPACES.
123456789101112131415161718192021222324252627282930313233343501 WS-TAX-CALCULATION. 05 WS-GROSS-INCOME PIC 9(8)V99. 05 WS-TAX-RATE PIC 9V9999. 05 WS-FEDERAL-TAX PIC 9(6)V99. 05 WS-STATE-TAX PIC 9(6)V99. 05 WS-TOTAL-TAX PIC 9(7)V99. PROCEDURE DIVISION. CALCULATE-TAXES. MOVE 75000.00 TO WS-GROSS-INCOME MOVE 0.2200 TO WS-TAX-RATE *> Calculate federal tax MULTIPLY WS-GROSS-INCOME BY WS-TAX-RATE GIVING WS-FEDERAL-TAX ROUNDED ON SIZE ERROR DISPLAY "Federal tax calculation error" MOVE 0 TO WS-FEDERAL-TAX NOT ON SIZE ERROR DISPLAY "Federal tax: $" WS-FEDERAL-TAX END-MULTIPLY *> Calculate state tax (5% of federal) MULTIPLY WS-FEDERAL-TAX BY 0.05 GIVING WS-STATE-TAX ROUNDED ON SIZE ERROR DISPLAY "State tax calculation error" MOVE 0 TO WS-STATE-TAX NOT ON SIZE ERROR DISPLAY "State tax: $" WS-STATE-TAX END-MULTIPLY *> Calculate total tax ADD WS-FEDERAL-TAX TO WS-STATE-TAX GIVING WS-TOTAL-TAX DISPLAY "Total tax liability: $" WS-TOTAL-TAX.
123456789101112131415161718192021222324252627282930313233343536373839404101 WS-INVESTMENT-CALC. 05 WS-PRINCIPAL PIC 9(8)V99 VALUE 10000.00. 05 WS-ANNUAL-RATE PIC 9V9999 VALUE 0.0650. 05 WS-COMPOUND-PERIODS PIC 9(2) VALUE 12. 05 WS-YEARS PIC 9(2) VALUE 5. 05 WS-PERIODIC-RATE PIC 9V999999. 05 WS-TOTAL-PERIODS PIC 9(4). 05 WS-COMPOUND-FACTOR PIC 9V999999. 05 WS-FINAL-VALUE PIC 9(8)V99. PROCEDURE DIVISION. CALCULATE-COMPOUND-INTEREST. *> Calculate periodic interest rate DIVIDE WS-ANNUAL-RATE BY WS-COMPOUND-PERIODS GIVING WS-PERIODIC-RATE ROUNDED *> Calculate total compounding periods MULTIPLY WS-YEARS BY WS-COMPOUND-PERIODS GIVING WS-TOTAL-PERIODS *> Calculate compound factor (1 + r) ADD 1 TO WS-PERIODIC-RATE GIVING WS-COMPOUND-FACTOR *> Apply compound factor for each period MOVE WS-PRINCIPAL TO WS-FINAL-VALUE PERFORM VARYING WS-YEARS FROM 1 BY 1 UNTIL WS-YEARS > WS-TOTAL-PERIODS MULTIPLY WS-FINAL-VALUE BY WS-COMPOUND-FACTOR GIVING WS-FINAL-VALUE ROUNDED ON SIZE ERROR DISPLAY "Compound calculation overflow" EXIT PERFORM END-MULTIPLY END-PERFORM DISPLAY "Investment growth:" DISPLAY " Principal: $" WS-PRINCIPAL DISPLAY " Final value: $" WS-FINAL-VALUE COMPUTE WS-COMPOUND-FACTOR = WS-FINAL-VALUE - WS-PRINCIPAL DISPLAY " Interest earned: $" WS-COMPOUND-FACTOR.
What's the difference between MULTIPLY...BY and MULTIPLY...GIVING?
Answer: MULTIPLY...BY performs in-place multiplication, storing the result back in the second operand. MULTIPLY...GIVING stores the result in a separate field, preserving the original operands. GIVING allows multiple target fields.
How does SIZE ERROR work with MULTIPLY operations?
Answer: SIZE ERROR is triggered when the multiplication result exceeds the capacity of the target field. It allows you to handle overflow conditions gracefully, providing alternative actions when calculations would cause data loss.
When should you use the ROUNDED option with MULTIPLY?
Answer: Use ROUNDED for financial calculations, currency operations, or when precision matters. It applies proper rounding rules when the result has more decimal places than the target field can store, ensuring accurate monetary calculations.