6.9. Příkaz DIVIDE Formát 1: DIVIDE {numerická-položka | numerický-literál} INTO {numerická-položka [ROUNDED]} ... [ON SIZE ERROR příkaz ... ] Funkce: Do každé z příjmových položek uvedených za slovem INTO se uloží její původní hodnota vydělená dělitelem uvedeným za slovem DIVIDE. Formát 2: DIVIDE numerická-položka BY {numerická-položka | numerický-literál} [ROUNDED] [ON SIZE ERROR příkaz ... ] Funkce: Do příjmové položky uvedené za slovem DIVIDE se uloží její původní hodnota vydělená dělitelem uvedeným za slovem BY. Formát 3: - - - - - - | numerická-položka | | INTO | | numerická-položka | DIVIDE < > < > < > | numerický-literál | | BY | | numerický-literál | - - - - - - GIVING {numerická-položka [ROUNDED]} ... [ON SIZE ERROR příkaz ... ] Funkce: Do každé z příjmových položek uvedených za slovem GIVING se uloží podíl hodnoty dělence uvedeného za slovem INTO (při formátu s INTO) resp. za slovem DIVIDE (při formátu s BY) a hodnoty dělitele uvedeného za slovem DIVIDE (při formátu s INTO) resp. za slovem BY (při formátu s BY). Původní hodnoty příjmových položek jsou bezvýznamné. Hodnota dělence ani dělitele se nezmění. Příklad: Následující dvojice příkazů jsou ekvivalentní: DIVIDE A INTO B a COMPUTE B = B / A DIVIDE A BY B a COMPUTE A = A / B DIVIDE A INTO B GIVING C a COMPUTE C = B / A DIVIDE A BY B GIVING C a COMPUTE C = A / B Poznámka: Formát příkazu DIVIDE se slovem INTO a formát příkazu DIVIDE se slovem BY jsou tedy rovnocenné, pouze je v nich vyměněno pořadí dělence a dělitele. Schématicky: DIVIDE dělitel INTO dělenec ... DIVIDE dělenec BY dělitel ... Příklad: Příkaz DIVIDE A INTO B GIVING C D E má stejný význam jako příkaz COMPUTE C D E = B / A; oba jsou ekvivalentní s COMPUTE POM = B / A MOVE POM TO C D E Dělení se dělá v pevné řádové čárce, když všechny zúčastněné položky a literály jsou celočíselné (dělenec, dělitel i všechny příjmové položky). Ve všech ostatních případech se dělení provede v pohyblivé řádové čárce. Formát 4: - - - - - - | numerická-položka | | INTO | | numerická-položka | DIVIDE < > < > < > | numerický-literál | | BY | | numerický-literál | - - - - - - [GIVING numerická-položka] [ROUNDED] REMAINDER numerická-položka [ON SIZE ERROR příkaz ... ] Není-li uvedena klauzule GIVING, pak dělenec uvedený za slovem INTO (při formátu s INTO) resp. za slovem DIVIDE (při formátu s BY) musí být položkou a nikoliv literálem. Funkce: Příkaz DIVIDE s klauzulí REMAINDER provádí jednak normální dělení podle výše uvedených pravidel (jako kdybychom si klauzuli REMAINDER odmysleli) a navíc ukládá zbytek po dělení do položky uvedené za slovem REMAINDER. Příkazy DIVIDE A INTO B GIVING C [ROUNDED] REMAINDER D DIVIDE B BY A GIVING C [ROUNDED] REMAINDER D jsou ekvivalentní a jsou překládány následujícím způsobem: MOVE A TO POMA MOVE B TO POMB COMPUTE POMC [ROUNDED] = POMB / POMA MOVE POMC TO C COMPUTE D = POMB - POMA * POMC Zde POMA resp. POMB resp. POMC označuje pomocný mezivýsledek určený pro úschovu hodnoty operandu A resp. B resp. C. Jsou-li A, B, C a D celočíselné údaje (položky nebo literály) jsou pomocné položky POMA, POMB resp. POMC celočíselné binární položky. V ostatních případech jsou položky POMA, POMB a POMC exponenciální dlouhé položky. Klauzule ROUNDED způsobí zaokrouhlování jen při výpočtu POMC (což vlastně znamená zaokrouhlování při výpočtu podílu C), nikoliv však při výpočtu zbytku D. Výše uvedená pravidla platí i pro oba formáty bez klauzule GIVING: DIVIDE A INTO B [ROUNDED] REMAINDER D DIVIDE B BY A [ROUNDED] REMAINDER D které jsou oba ekvivalentní s příkazem DIVIDE A INTO B GIVING B [ROUNDED] REMAINDER D Je-li v příkazu DIVIDE s klauzulí REMAINDER uvedena též klauzule ON SIZE ERROR, pak testování, zda hodnota výsledku nepřesahuje rozsah příjmové položky, se provádí jednak při výpočtu podílu C (přesněji: při výpočtu POMC) a dále též při výpočtu zbytku D. Pokud se klauzule ON SIZE ERROR uplatní již při výpočtu podílu C, výpočet zbytku D se již neprovádí a jak položka určená pro příjem podílu, tak i položka D uvedená za slovem REMAINDER zůstávají nezměněny. Příklad: Je-li A = 3, B = 5 a položky C i D mají PIC S999, po provedení příkazu "DIVIDE A INTO B GIVING C REMAINDER D" bude C = 1, D = 2. Příklad: V praxi se příkaz DIVIDE s klauzulí REMAINDER používá téměř výhradně pro celočíselné položky a literály. Není to však nezbytné; je-li např. B = 5 a položky C i D mají PIC S9V9, pak po provedení příkazu "DIVIDE 3 INTO B GIVING C REMAINDER D" bude C = 1.6, D = 0.2. Naproti tomu po provedení příkazu "DIVIDE 3 INTO B GIVING C ROUNDED REMAINDER D" bude C = 1.7, D = -0.1.