COBOL - Statement operations - Fixed-point contrasted with floating-point arithmetic



Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

COBOL - Statement operations - Fixed-point contrasted with floating-point arithmetic
Enterprise COBOL for z/OS, V4.2, Language Reference

Como você codifica aritmética em um programa (seja uma instrução aritmética, uma função intrínseca, uma expressão ou alguma combinação desses aninhados entre si) determina se a avaliação é feita com aritmética de ponto flutuante ou de ponto fixo.

Muitas declarações em um programa podem envolver aritmética.
Por exemplo, cada um dos seguintes tipos de instruções COBOL requer alguma avaliação aritmética:

  • Aritmética geral
               COMPUTE REPORT-MATRIX-COL = (EMP-COUNT ** .5) + 1
               ADD REPORT-MATRIX-MIN TO REPORT-MATRIX-MAX GIVING REPORT-MATRIX-TOT
  • Expressões e funções
               COMPUTE REPORT-MATRIX-COL = FUNCTION SQRT(EMP-COUNT) + 1
               COMPUTE WHOLE-HOURS       = FUNCTION INTEGER-PART((AVERAGE-HOURS) + 1)
  • Comparações aritméticas
               IF REPORT-MATRIX-COL <     FUNCTION SQRT(EMP-COUNT) + 1
               IF WHOLE-HOURS       NOT = FUNCTION INTEGER-PART((AVERAGE-HOURS) + 1)

Avaliações de ponto flutuante

Em geral, se sua codificação aritmética tiver uma das características listadas abaixo, ela será avaliada na aritmética de ponto flutuante:

  • Um operando ou campo de resultado é ponto flutuante.

    Um operando é um ponto flutuante se você o codificar como um literal de ponto flutuante ou se você o codificar como um item de dados definido como USAGE COMP-1, USAGE COMP-2 ou ponto flutuante externo (USAGE DISPLAY ou USAGE NATIONAL com um PICTURE de ponto flutuante).

    Um operando que é uma expressão aritmética aninhada ou uma referência a uma função intrínseca numérica resulta em aritmética de ponto flutuante quando qualquer uma das seguintes condições for verdadeira:

    • Um argumento em uma expressão aritmética resulta em ponto flutuante.
    • A função é uma função de ponto flutuante.
    • A função é uma função mista com um ou mais argumentos de ponto flutuante.
  • Um expoente contém casas decimais.

    Um expoente contém casas decimais se você usar um literal que contenha casas decimais, atribuir ao item uma PICTURE que contenha casas decimais ou usar uma expressão ou função aritmética cujo resultado tenha casas decimais.

Uma expressão aritmética ou função numérica gera um resultado com casas decimais se algum operando ou argumento (excluindo divisores e expoentes) tiver casas decimais.

Avaliações de ponto fixo

Em geral, se uma operação aritmética contiver nenhuma das características listadas acima para ponto flutuante, o compilador fará com que seja avaliada na aritmética de ponto fixo.
Em outras palavras, as avaliações aritméticas são tratadas como ponto fixo somente se todos os operandos forem ponto fixo, o campo de resultado estiver definido como ponto fixo e nenhum dos expoentes representar valores com casas decimais.
Expressões aritméticas aninhadas e referências de função também devem representar valores de ponto fixo.

Comparações aritméticas (condições de relação)

Quando você compara expressões numéricas usando um operador relacional, as expressões numéricas (sejam itens de dados, expressões aritméticas, referências de função ou alguma combinação delas) são comparadas no contexto de toda a avaliação.
Ou seja, os atributos de cada um podem influenciar a avaliação do outro: ambas as expressões são avaliadas em ponto fixo ou ambas são avaliadas em ponto flutuante. Por exemplo:

           IF (A + D) = (B + E) AND C

Essa afirmação tem duas comparações: (a + d) = (b + e) ??e (a + d) = c.
Embora (a + d) não apareça explicitamente na segunda comparação, é uma comparação e nessa comparação.
Portanto, os atributos de c podem influenciar a avaliação de (a + d).

O compilador manipula comparações (e a avaliação de quaisquer expressões aritméticas aninhadas em comparações) na aritmética de ponto flutuante se o comparando for um valor de ponto flutuante ou for resolvido para um valor de ponto flutuante.

O compilador manipula comparações (e a avaliação de quaisquer expressões aritméticas aninhadas em comparações) na aritmética de ponto fixo se ambos os comparandos forem valores de ponto fixo ou resolverem valores de ponto fixo.

Comparações implícitas (nenhum operador relacional usado) não são tratadas como uma unidade; os dois comparandos são tratados separadamente quanto à sua avaliação na aritmética de ponto flutuante ou de ponto fixo.
No exemplo a seguir, cinco expressões aritméticas são avaliadas independentemente dos atributos uma da outra e, em seguida, são comparadas entre si.

           EVALUATE (A + D)
                    WHEN (B + E) THRU C
                    WHEN (F / G) THRU (H * I)
       . . .
           END-EVALUATE

Exemplos: fixed-point and floating-point evaluations



© Copyright IBM Corp.