COBOL - Coding your program - Fixed-point contrasted with floating-point arithmetic



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

COBOL - Codificando seu programa - Ponto fixo contrastado com aritmética de ponto flutuante
Enterprise COBOL for z/OS, Version 4.2

A maneira como você codifica a aritmética em um programa (seja uma instrução aritmética, uma função intrínseca, uma expressão ou alguma combinação delas aninhadas umas nas outras) determina se a avaliação é feita com aritmética de ponto flutuante ou de ponto fixo.

Muitas instruçõ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 em aritmética de ponto flutuante:

    • Um operando ou campo de resultado é um ponto flutuante.

      Um operando é ponto flutuante se você codificá-lo como literal de ponto flutuante ou 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 contém casas decimais, fornecer ao item uma PICTURE que contém casas decimais ou usar uma expressão aritmética ou função cujo resultado tenha casas decimais.

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

    Avaliações de ponto fixo

    Em geral, se uma operação aritmética não contiver nenhuma das características listadas acima para ponto flutuante, o compilador fará com que ela seja avaliada em aritmética de ponto fixo.
    Em outras palavras, as avaliações aritméticas são tratadas como ponto fixo apenas se todos os operandos forem de ponto fixo, o campo de resultado for 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 comparandos no contexto de toda a avaliação.
    Ou seja, os atributos de cada um podem influenciar na avaliação do outro: ambas as expressões são avaliadas em ponto fixo, ou ambas são avaliadas em ponto flutuante.
    Isso também é verdadeiro para comparações abreviadas, mesmo que um comparando não apareça explicitamente na comparação. 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, é um comparando nessa comparação.
    Portanto, os atributos de c podem influenciar a avaliação de (A + D).

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

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

    Comparações implícitas (nenhum operador relacional usado) não são tratadas como uma unidade, entretanto; os dois comparandos são tratados separadamente quanto à sua avaliação em 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

    Examples: fixed-point and floating-point evaluations - Exemplos: avaliações de ponto fixo e ponto flutuante



    © Copyright IBM Corp.