Archives par mot-clé : MULTIPLY

8.2 LES INSTRUCTIONS ARITHMETIQUES

Les instructions arithmétiques sont de 2 types:

  • les opérations simples :
    ADD
    SUBTRACT
    MULTIPLY
    DIVIDE
  • les opérations complexes :
    COMPUTE et ses opérateurs + – * / **

Ces instructions disposent d’options communes :

GIVING nom-de-donnée :
qui indique que le résultat de l’opération sera mémorisé dans nom-de-donnée.
ADD VAR1 VAR2 GIVING RESULTAT

ROUNDED :
après une opération le résultat tronque les décimales au-delà de ce qui
a été déclaré dans la PIC. Ainsi la quantité 234,478 sera de 234,4 si la
PIC de la variable résultat est de 999V9.
Avec ROUNDED, COBOL ajoute 5 au premier chiffre non significatif de droite pour réaliser l’arrondi à l’unité supérieure du chiffre le moins significatif si le premier chiffre non significatif de droite est >= 5.
Avec rounded notre exemple devient 234,5.

ON SIZE ERROR ordre impératif

Cette option permet de prévenir des incidents de calcul comme :
– la division par zéro
– les dépassements de capacité (pour rappel un numérique est limité à 18 chiffres)

exemple : DIVIDE A BY B ON SIZE ERROR MOVE ZERO TO B

!!!! Les calculs ne pourront se faire naturellement qu’avec des zones élémentaires numériques, il en ira de même pour les constantes. !!!!

L’ADDITION – ADD

Format n°1 :

    | nom-de-donnée-1      | | nom-de-donné-2       |
ADD |                                                         |     |                                                          |
    | littéral-numérique-1 | | littéral-numérique-2 |

    TO nom-de-donnée
[ ROUNDED].
     nom-de-donnée
-n [ ROUNDED].
   [ ON SIZE ERROR ordre-impératif
].

On ajoute nom-de-donnée-1 ou littéral-numérique-1 et nom-de-donnée-2 ou littéral-numérique-2 à la variable nom-de-donnée et le résultat peut être arrondi.

Exemple :

ADD 1000 QTE1 TO TOTAL ROUNDED ON SIZE ERROR MOVE 0 TO TOTAL

Ce qui signifie ajouter 1000 + QTE1 + TOTAL arrondir, transférer le résultat de l’opération dans TOTAL. En cas d’erreur mettre TOTAL à 0.

Format n° 2 :

    |nom-de-donnée-1| |nom-de-donné-2|     |nom-de-donné-n|
ADD |                                         |    |                                      | … |                                        |
    | littéral-1    | | littéral-2   |  | littéral-n   |

    GIVING nom-de-donnée
[ ROUNDED].
   [ ON SIZE ERROR ordre-impératif
].

Dans ce cas on ajoute nom-donnée-1 à nom-donnée-2 à….. nom-donnée-n le résultat est placé dans nom-de-donnée, éventuellement arrondi.

Exemple :
ADD TVA TOTHTVA GIVING TOTTVAC

Format n°3 :

ADD CORRESPONDING nom-de-groupe-1 TO nom-de-groupe2
[ ROUNDED ] [ ON SIZE ERROR ordre-imp. ]

Avec ce format, les zones élémentaires du groupe-1 sont additionnées aux données élémentaires du groupe-2 ayants des noms-données identiques, et les résultats sont placés dans les zones élémentaires du groupe-2.

L’abréviation COBOL de CORRESPONDING est CORR. Les clauses OCCURS et REDEFINES sont mal supportées.

Prenons par exemple un fichier paie mensuel d’enregistrement ENRMENS et le fichier ENRTOT.

De description :

01 ENRMENS.
   02 CODE-EMPLOYEE PIC 999.
   02 HEURE-P       PIC 999.
   02 SAL-BRUT      PIC 9(6).
01 ENRTOT.
   02 COD-EMPL      PIC 999.
   02 HEURE-P       PIC 999.
   02 SAL-BRUT      PIC 9(6).
   02 SAL-NET       PIC 9(6).

Le fait d’écrire ADD CORR ENRMENS TO ENRTOT, engendre les additions suivantes :

HEURE-P OF ENRTOT = HEURE-P OF ENRTOT + HEURE-P OF ENRMENS
SAL-BRUT OF ENRTOT = SAL-BRUT OF ENRTOT + SAL-BRUT OF ENRMENS

ADD identifier-1 TO identifier-2
         ROUNDED ON SIZE ERROR ordre-impératif-1
         NOT ON SIZE ERROR ordre impératif-2
END-ADD

ADD identifier-1 TO identifier-2
         GIVING identifier-3 ROUNDED
         ON SIZE ERROR ordre-impératif-1
         NOT ON SIZE ERROR ordre-impératif-2
END-ADD

Identifier-1 peut être une constante ou une variable numérique ou un ensemble des deux.
Les ordres impératifs 1 et 2 peuvent être constitués d’une ou de plusieurs instructions.
Avec l’option GIVING identifier-2 peut également être une constante numérique puisque le résultat est placé dans identifier-3.

LA SOUSTRACTION – SUBTRACT

Format 1 :

        |Identifier-1|
SUBTRACT|                                 |   FROM identifier-2 ROUNDED
        | littéral-1 |

        ON SIZE ERROR ordre-impératif-1

      NOT ON SIZE ERROR ordre-impératif-2

END-SUBTRACT

Format 2 :

        |Identifier-1|      |Identifier-2|
SUBTRACT|                                 |   FROM |            |
        | littéral-1 |      | littéral-2 |

      GIVING  identifier-3
 
    ROUNDED ON SIZE ERROR ordre-impératif-1

          NOT ON SIZE ERROR ordre-impératif-2

END-SUBTRACT

Format 3 :

SUBTRACT CORR identifier-1 FROM identifier-2 ROUNDED
ON SIZE ERROR ordre-impératif-1
NOT ON SIZE ERROR ordre-impératif-2
END-SUBTRACT

Remarques:
identifier-1 peut être une série de variables ou de constantes numériques.
Les options ROUNDED et ON SIZE ERROR ne sont pas obligatoires.
END-SUBTRACT ne s’applique que si les options SIZE ERROR sont utilisées.

Exemple :
SUBTRACT V1 V2 12 FROM TOTAL. (TOTAL = TOTAL – (V1 + V2 + 12))
SUBTRACT V1 V2 12 FROM TOTAL GIVING SOUSTOT.
(SOUSTOT = TOTAL – (V1 + V2 + 12))

Dans le 1er cas TOTAL doit être un numérique de travail, dans le 2ème cas SOUSTOT peut être un numérique d’édition car il n’intervient pas dans le calcul.

LA MULTIPLICATION – MULTIPLY

Format 1 :

        |Identifier-1|
MULTIPLY|                                 |   BY identifier-2 ROUNDED
        | littéral-1 |

        ON SIZE ERROR ordre-impératif-1

        NOT ON SIZE ERROR ordre-impératif-2

END-MULTIPLY

Format 2 :

         |Identifier-1|     |Identifier-2|
MULTIPLY |                                 |    BY |            |
         | littéral-1 |     | littéral-2 |

      GIVING  identifier-3
 
    ROUNDED ON SIZE ERROR ordre-impératif-1

          NOT ON SIZE ERROR ordre-impératif-2

END-MULTIPLY

Exemple :
MULTIPLY 12 BY V1.           ( V1 = V1 * 12)
MULTIPLY V1 BY V2 GIVING V3. ( V3 = V1 * V2)

LA DIVISION – DIVIDE

Format 1 :

       |Identifier-1|
DIVIDE |                                 |   INTO identifier-2 ROUNDED
       | littéral-1 |

        ON SIZE ERROR ordre-impératif-1

        NOT ON SIZE ERROR ordre-impératif-2

END-DIVIDE

Format 2 :

         |Identifier-1| |INTO| |Identifier-2|
DIVIDE   |                                 | |    | |            |
         | littéral-1 | | BY | | littéral-2 |

      GIVING  identifier-3
 
    ROUNDED ON SIZE ERROR ordre-impératif-1

          NOT ON SIZE ERROR ordre-impératif-2

END-DIVIDE

Format 3 :

         |Identifier-1| |INTO| |Identifier-2|
DIVIDE   |                                 | |    | |            |
         | littéral-1 | | BY | | littéral-2 |

      GIVING  identifier-3
      ROUNDED
REMAINDER identifier-4
 
    ON SIZE ERROR ordre-impératif-1

      NOT ON SIZE ERROR ordre-impératif-2

END-DIVIDE

Exemple :
DIVIDE 10 INTO V1. (V1 = V1 / 10)
DIVIDE V1 BY V2 GIVING V3. ( V3 = V1 / V2)
DIVIDE V1 BY V2 GIVING V3 REMAINDER RESTE.
(V3 = V1 / V2) et RESTE = V1 – (V2 * V3)

le tout en entier sans quoi il n’y a pas de reste

L’INSTRUCTION – COMPUTE

                        |expression-arithmétique|
COMPUTE  nom-item-1 =   |constant             |   
                        |nom-item               |

Les symboles arithmétiques valides sont :

+ pour l’addition
– pour la soustraction
* pour la multiplication
/ pour la division
** pour l’exposant

Un symbole arithmétique doit être précédé et suivi par au moins un espace.

Format :
COMPUTE identifier-1 ROUNDED = expression
ON SIZE ERROR ordre-impératif-1
NOT ON SIZE ERROR ordre-impératif-2
END-COMPUTE

L’expression : doit être composée de constantes et de variables numériques séparées par des opérateurs arithmétiques.

Les opérateurs sont : + – * / ** ( )

Avec + pour addition, – pour la soustraction, * pour la multiplication, le / pour la division et ** pour un exposant.

Exemple :
COMPUTE RESULTAT = A + (B – 3) * (G / 4) + ( E ** 2).

L’expression est analysée de la gauche vers la droite en tenant compte des priorités suivantes :
d’abord les exposants **, ensuite les * et / puis les + et -.
Il faut autant de ( gauches que de ) droites.

Exemple – MULTIPLY

Programme utilisant le MULTIPLY :

IDENTIFICATION DIVISION.
PROGRAM-ID.  MULTIPLY.
AUTHOR.      LA COMMUNAUTE DU COBOL.

ENVIRONMENT DIVISION.                                            
CONFIGURATION SECTION.                                           
SPECIAL-NAMES.                                                   
    DECIMAL-POINT IS COMMA. 

DATA DIVISION.
WORKING-STORAGE SECTION.

01  WS-AUXILIARES.
    05  VALEUR-1         PIC S9(009)       VALUE ZEROES. 
    05  VALEUR-2         PIC S9(009)       VALUE ZEROES. 
    05  VALEUR-3         PIC S9(009)       VALUE ZEROES. 

PROCEDURE DIVISION.

001-INIT.

Exemple MULTIPLY

    MOVE   8 TO VALEUR-1
    MOVE   9 TO VALEUR-2
    MULTIPLY VALEUR-1 BY VALEUR-2	
    DISPLAY "VALEUR-1  " VALEUR-1 
    DISPLAY "VALEUR-2  " VALEUR-2 

* Resultat de test:

* VALEUR-1  +000000008
* VALEUR-2  +000000072

    MOVE  23 TO VALEUR-1
    MULTIPLY 5 BY VALEUR-1	
    DISPLAY "VALEUR-1  " VALEUR-1 

* Resultat de test:

* VALEUR-1  +000000115

    MOVE -10 TO VALEUR-1
    MULTIPLY 5 BY VALEUR-1	
    DISPLAY "VALEUR-1  " VALEUR-1 

* Resultat de test:

* VALEUR-1  -000000050

    MOVE -10 TO VALEUR-1
    MULTIPLY -5 BY VALEUR-1	
    DISPLAY "VALEUR-1  " VALEUR-1 

* Resultat de test:

* VALEUR-1  +000000050

Exemple MULTIPLY GIVING

    MOVE   8 TO VALEUR-1
    MOVE   9 TO VALEUR-2
    MOVE  16 TO VALEUR-3
    MULTIPLY VALEUR-1 BY VALEUR-2 GIVING VALEUR-3	
    DISPLAY "VALEUR-1  " VALEUR-1 
    DISPLAY "VALEUR-2  " VALEUR-2 
    DISPLAY "VALEUR-3  " VALEUR-3 

* Resultat de test:

* VALEUR-1  +000000008
* VALEUR-2  +000000009
* VALEUR-3  +000000072

    MOVE  10 TO VALEUR-1
    MOVE  -2 TO VALEUR-2
    MULTIPLY VALEUR-1 BY VALEUR-2 GIVING VALEUR-3	
    DISPLAY "VALEUR-1  " VALEUR-1 
    DISPLAY "VALEUR-2  " VALEUR-2 
    DISPLAY "VALEUR-3  " VALEUR-3 

* Resultat de test:

* VALEUR-1  +000000010
* VALEUR-2  -000000002
* VALEUR-3  -000000020

    MOVE -10 TO VALEUR-1
    MOVE   2 TO VALEUR-2
    MULTIPLY VALEUR-1 BY VALEUR-2 GIVING VALEUR-3	
    DISPLAY "VALEUR-1  " VALEUR-1 
    DISPLAY "VALEUR-2  " VALEUR-2 
    DISPLAY "VALEUR-3  " VALEUR-3 

* Resultat de test:

* VALEUR-1  -000000010
* VALEUR-2  +000000002
* VALEUR-3  -000000020

    MOVE -10 TO VALEUR-1
    MOVE  -2 TO VALEUR-2
    MULTIPLY VALEUR-1 BY VALEUR-2 GIVING VALEUR-3	
    DISPLAY "VALEUR-1  " VALEUR-1 
    DISPLAY "VALEUR-2  " VALEUR-2 
    DISPLAY "VALEUR-3  " VALEUR-3 

* Resultat de test:

* VALEUR-1  -000000010
* VALEUR-2  -000000002
* VALEUR-3  +000000020

    MOVE  23 TO VALEUR-1
    MOVE  78 TO VALEUR-2
    MULTIPLY 5       BY VALEUR-2 GIVING VALEUR-2	
    DISPLAY "VALEUR-1  " VALEUR-1 
    DISPLAY "VALEUR-2  " VALEUR-2 

* Resultat de test:

* VALEUR-1  +000000023
* VALEUR-2  +000000390