| Bellacosa Mainframe e as variaveis computacionais do COBOL |
☕💣🚀 COMP-1, COMP-2, COMP-3, COMP-4 e COMP-5 para o Programador COBOL Jr.
Uma das maiores fontes de confusão para quem começa em COBOL é entender por que existem tantos tipos numéricos.
A resposta está na história dos mainframes IBM.
Cada COMP surgiu para resolver um problema específico de armazenamento, desempenho ou precisão matemática. (IBM)
Linha do Tempo
| Tipo | Surgiu |
|---|---|
| COMP | Década de 1960 |
| COMP-1 | Década de 1970 |
| COMP-2 | Década de 1970 |
| COMP-3 | Década de 1960 |
| COMP-4 | Década de 1970 |
| COMP-5 | Década de 1980 |
Os números exatos variam conforme compilador e plataforma, mas COMP-3 e COMP já existiam nos ambientes System/360. COMP-1, COMP-2 e COMP-4 apareceram como extensões IBM. COMP-5 surgiu posteriormente para resolver limitações do BINARY tradicional. (IBM)
COMP-1
O que é
Ponto flutuante simples (single precision).
Ocupa:
4 bytes
Utilizado para:
cálculos científicos
engenharia
estatística
Não deve ser usado para dinheiro. (IBM)
Exemplo
01 WS-TEMPERATURA COMP-1.
MOVE 23.75 TO WS-TEMPERATURA.
Vantagens
rápido
suporta expoentes
ocupa pouco espaço
Desvantagens
perde precisão decimal
gera arredondamentos inesperados
Exemplo clássico
COMPUTE RESULT = 0.1 + 0.2
Resultado pode não ser exatamente:
0.300000
Isso acontece porque o valor é armazenado em binário.
COMP-2
O que é
Ponto flutuante duplo (double precision).
Ocupa:
8 bytes
Muito mais preciso que COMP-1. (IBM)
Exemplo
01 WS-PI COMP-2.
MOVE 3.14159265358979 TO WS-PI.
Vantagens
enorme faixa de valores
excelente precisão científica
Desvantagens
mais lento
ocupa mais memória
inadequado para dinheiro
COMP-3
O Rei dos Bancos
Também chamado:
PACKED DECIMAL
ou
COMPUTATIONAL-3
É o formato mais amado pelos bancos. (IBM)
Como funciona
Cada byte armazena:
2 dígitos
mais um nibble de sinal.
Exemplo
01 SALDO PIC S9(7)V99 COMP-3.
Valor:
12345.67
Internamente:
12 34 56 7C
(C = positivo)
Vantagens
extremamente compacto
precisão decimal perfeita
ideal para dinheiro
Desvantagens
CPU precisa converter para cálculo
não é legível em dump
Melhor uso
Contas correntes
Faturas
Cartões
Seguros
Folha de pagamento
COMP-4
O que é
Binário IBM.
Sinônimo de:
BINARY
COMP
na maioria dos compiladores IBM. (IBM)
Exemplo
01 CONTADOR PIC S9(4) COMP-4.
Tamanho
| Dígitos | Bytes |
|---|---|
| 1-4 | 2 |
| 5-9 | 4 |
| 10-18 | 8 |
(IBM)
Vantagens
muito rápido
ideal para índices
excelente para contadores
Desvantagens
O comportamento depende do:
TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)
Isso já causou milhares de bugs em migrações COBOL. (IBM)
COMP-5
O que é
Binary Native.
Foi criado para eliminar limitações do COMP-4. (IBM)
Exemplo
01 WS-ID PIC S9(4) COMP-5.
Diferença Fundamental
Mesmo declarando:
PIC S9(4)
um COMP-5 de 2 bytes pode armazenar:
-32768
até
+32767
porque usa a capacidade real do campo binário. (IBM)
Vantagens
mais rápido
ideal para APIs
ideal para CICS
ideal para LE
ideal para interoperabilidade com C
Desvantagens
pode surpreender quem espera validação pelo PIC
programas antigos podem comportar-se diferente
Comparação Geral
| Característica | COMP-1 | COMP-2 | COMP-3 | COMP-4 | COMP-5 |
|---|---|---|---|---|---|
| Tipo | Float | Float | Decimal | Binário | Binário Nativo |
| Bytes | 4 | 8 | Variável | 2/4/8 | 2/4/8 |
| Dinheiro | ❌ | ❌ | ✅ | ⚠️ | ⚠️ |
| Velocidade | Alta | Alta | Média | Muito Alta | Muito Alta |
| Precisão Decimal | Baixa | Média | Excelente | Boa | Boa |
| Interoperabilidade | Média | Média | Baixa | Média | Excelente |
Opções de Compilação que Afetam Tudo
TRUNC
TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)
Principal responsável por diferenças em COMP e COMP-4. (IBM)
ARITH
ARITH(COMPAT)
ARITH(EXTEND)
Impacta precisão matemática.
Muito importante para:
COMP-3
COMPUTE
DIVIDE
MULTIPLY
NUMPROC
NUMPROC(PFD)
NUMPROC(MIG)
NUMPROC(NOPFD)
Afeta tratamento de sinais inválidos em COMP-3.
RULES(NOEVENPACK)
Detecta packed decimals com número par de dígitos, ajudando a otimizar COMP-3. (IBM)
Problemas Conhecidos
1. Dinheiro em COMP-1
Erro clássico.
01 SALDO COMP-1.
Nunca faça isso.
2. Migração COBOL V4 → V6
Mudanças em:
TRUNC
ARITH
OPTIMIZATION
geraram diferenças de resultados em milhares de aplicações. (IBM)
3. COMP-3 Corrompido
Dump:
12 34 5F
Sinal inválido.
Pode gerar:
S0C7
4. Overflow Silencioso
Muito comum em:
COMP
COMP-4
quando TRUNC(BIN) está ativo.
Easter Eggs e Curiosidades
1. O banco não gosta de FLOAT
Em muitos bancos você encontrará:
0 ocorrências de COMP-1
0 ocorrências de COMP-2
em milhões de linhas COBOL.
2. COMP-3 domina Wall Street
Grande parte dos sistemas financeiros de alto volume ainda utiliza COMP-3 para valores monetários devido à precisão decimal exata.
3. TRUNC(BIN) "transforma" COMP em COMP-5
Na prática, muitos comportamentos tornam-se equivalentes para operações binárias. (IBM)
4. Packed Decimal foi uma genialidade da IBM
Quando memória custava fortunas, armazenar dois dígitos por byte era uma enorme vantagem econômica.
Regra de Ouro para o Programador COBOL Jr.
Se estiver em dúvida:
Dinheiro -> COMP-3
Contadores -> COMP-5
Índices -> COMP-5
Percentuais -> COMP-3
Cálculos científicos -> COMP-2
Integração C/C++ -> COMP-5
Em ambientes modernos z/OS com Enterprise COBOL 6.x, a combinação mais comum e segura é:
COMP-3 para valores financeiros
COMP-5 para inteiros e contadores
Essa dupla cobre praticamente 95% das necessidades de aplicações corporativas em bancos, seguradoras e grandes empresas. (IBM)