6.5. Příkaz COMPUTE Formát: COMPUTE {numerická-položka [ROUNDED]}... = aritmetický-výraz [ ON SIZE ERROR příkaz ... ] Funkce: Vypočítá se hodnota aritmetického výrazu (viz 5.3.) a dosadí se do příjmové položky uvedené (resp. příjmových položek uvedených) za slovem COMPUTE. Příklady: COMPUTE ALFA (I J) = POM ** 2 / (BETA (I) * (A - 4.56)) COMPUTE VYSLEDEK ROUNDED = DAN COMPUTE A = B + C * D ON SIZE ERROR GO TO OSETRENI. COMPUTE A B ROUNDED C = D * (E - 1) Poznámka: Příkaz COMPUTE s jedinou příjmovou položkou, v němž nejsou uvedeny klauzule ROUNDED ani ON SIZE ERROR, a u něhož aritmetický výraz je tvořen jediným operandem, je ekvivalentní s příkazem MOVE (i pokud jde o příkazy přeloženého programu). Poznámka: Každý z ostatních aritmetických příkazů ADD, SUBTRACT, MULTIPLY a DIVIDE může být vždy nahrazen vhodným příkazem COMPUTE. V příkazu COMPUTE lze používat funkce SIN, COS, EXP, SQRT atd.; u ostatních aritmetických příkazů zase může být výpočet o něco efektivnější. 6.10. Formát mezivýsledků aritmetických příkazů Aritmetický výraz, který se v COBOLu vyskytuje v příkazu COMPUTE a v podmíněném výrazu (a to ve znaménkovém a relačním testu), se při překladu převádí na aritmetický výraz v jazyce C podle těchto pravidel: 1) Závorky a operátory + - * / se předávají beze změny. 2) Literály se předávají jako celočíselné pouze tehdy, když byly v COBOLském programu uvedeny jako celočíselné (s maximálně devíti ciframi) a když i výsledná hodnota aritmetického výrazu bude celočíselná (tzn., že žádná operace se neprovede v pohyblivé řádové čárce). V opačném případě je literál předáván v takovém tvaru, aby při výpočtu byla jeho hodnota v pohyblivé řádové čárce a nemusel se dělat během výpočtu převod z pevné do pohyblivé řádové čárky. Poznámka: Každá operace * a / se provádí v pohyblivé řádové čárce. 3) Na místě položky se v jazyce C objeví výraz reprezentující hodnotu dané položky. Tato hodnota je celočíselná v případě, že daná položka byla celočíselná s maximálně devíti ciframi (včetně položek numerických editovaných) a i výsledná hodnota aritmetického výrazu bude celočíselná. V ostatních případech představuje daný výraz hodnotu v pohyblivé řádové čárce. 4) Operátor ** se převádí na volání funkce pow(x,y) v jazyce C. Oba operandy i výsledek jsou v pohyblivé řádové čárce. Poznámka: Místo A ** 2 lze psát A * A, což je pak rychleji provedeno, nicméně násobení se provádí v pohyblivé řádové čárce a tudíž se tím převodu do pohyblivé řádové čárky nezabrání. Překlad ostatních aritmetických příkazů (ADD, SUBTRACT, MULTIPLY, DIVIDE, klauzule BY v příkazu PERFORM, klauzule VARYING v příkazu SEARCH, klauzule SUM v REPORT SECTION atd.) probíhá podle obdobných pravidel, jako u obecného aritmetického výrazu. Vzhledem k tomu, že se v těchto případech jedná o specializované a někdy velmi jednoduché aritmetické výrazy, může být za určitých okolností přeložený program efektivnější než u obecného aritmetického výrazu. Toto zefektivnění může být dvojího druhu: 1) Provedení výpočtu v pevné řádové čárce tam, kde to je možné, ale obecný aritmetický výraz se přesto vyhodnocuje v pohyblivé řádové čárce. Příklad: 77 A PIC 999. 77 B PIC S9(5) COMP-3. 77 C PIC S9(8). 77 D PIC S9(9) COMP. Příkaz COMPUTE D = C - A - B se provede v pevné řádové čárce. Pokud by byly popisy položek: 77 A PIC 9V99. 77 B PIC S999V99 COMP-3. 77 C PIC S9(6)V99. 77 D PIC S9(7)V99 COMP. výše uvedený příkaz by se spočítal v pohyblivé řádové čárce, protože položky A, B a C nejsou celočíselné. Přitom je vidět, že by výpočet mohl proběhnout pomocí stejných strojových instrukcí. Nahradíme-li ve výše uvedeném příkladě příkaz COMPUTE příkazem SUBTRACT A B FROM C GIVING D, přeloží se příkaz SUBTRACT v obou případech stejně, přičemž výpočet proběhne v pevné řádové čárce. Tento druh zefektivnění se uplatňuje pouze u příkazů ADD a SUBTRACT, přičemž všechny operandy těchto příkazů musí být v pevné řádové čárce a výsledek smí mít nejvýše 9 cifer. 2) Vypočtená hodnota se neukládá do mezivýsledku, ale přímo se přesouvá do příjmové položky. Například příkaz ADD A TO B GIVING C se přeloží jako "MOVE (A + B) TO C". Tento druh zefektivnění se uplatňuje u příkazů ADD, SUBTRACT, MULTIPLY, DIVIDE a u klauzulí VARYING, SUM atd. Podmínkou je, aby se jednalo o operaci se dvěma operandy (Příkaz ADD A B TO C se nepřeloží jako "MOVE (A+B+C) TO C") a aby v příkazu nebyla uvedena klauzule ROUNDED nebo ON SIZE ERROR. Operace se provede v pevné řádové čárce, pokud bude mít výsledek nejvýše 9 cifer a pokud se při dělení získá alespoň tolik míst za desetinnou tečkou, kolik jich má příjmová položka. V opačném případě se operace provede v pohyblivé řádové čárce.