Por que quase ninguém usa ponto flutuante em COBOL?

Por que quase não usamos variáveis com ponto flutuante em COBOL
Black Ice on Pexels

O COBOL possui dois tipos principais de campos com ponto flutuante: COMP-1 (FLOAT-SHORT) e COMP-2 (FLOAT-LONG). A diferença entre eles está no tamanho ocupado em memória, no valor máximo que conseguem armazenar e, principalmente, na precisão.

Mas raramente encontramos programas em produção usando esse tipo de campo, e o motivo para isso está na natureza dos sistemas comerciais e na necessidade de precisão decimal absoluta.

A declaração de campos com ponto flutuante

No COBOL, podemos criar variáveis com ponto flutuante incluindo a cláusula USAGE IS na sua declaração:


01 WT-TX-JUROS USAGE IS COMP-1.
01 WT-TX-JUROS COMP-1.
01 WT-TX-JUROS FLOAT-SHORT.

Para trabalhar com uma variável de maior amplitude, podemos escrever:


01 WT-TX-JUROS USAGE IS COMP-2.
01 WT-TX-JUROS COMP-2.
01 WT-TX-JUROS FLOAT-LONG.

As pictures não devem ser declaradas em campos com ponto flutuante, pois o próprio compilador estabelece o tamanho de cada variável. A direrença entre COMP-1 (FLOAT-SHORT) e COMP-2 (FLOAT-LONG) está no espaço ocupado, no valor máximo que pode ser armazenado e na precisão decimal:

  • COMP-1 ocupa 4 bytes, alcança valores extremamente altos (até aproximadamente 3.4 × 10³⁸) e possui cerca de 7 dígitos de precisão.

  • COMP-2 ocupa 8 bytes, pode armazenar números ainda maiores (cerca de 1.79 × 10³⁰⁸) e oferece aproximadamente 16 dígitos de precisão.

A questão da precisão decimal

À primeira vista, parecem excelentes opções, pois podem armazenar valores muito altos ocupando pouco espaço, mas o problema está justamente na precisão decimal.

Em sistemas comerciais e financeiros, trabalhamos com valores monetários — saldo de conta, juros, impostos, pagamentos acumulados. Esses valores passam por milhares ou milhões de cálculos. E quando utilizamos ponto flutuante, pequenas imprecisões nas casas decimais vão se acumulando ao longo do processamento.

Isso fica evidente no programa abaixo. O simples fato de somar um centavo às variáveis, 5 milhões de vezes, provoca uma diferença significativa quando comparamos os valores obtidos com a variável de ponto fixo e as variáveis de ponto flutuante.

identification division.
program-id. yfloat.

environment division.
configuration section.
special-names.
decimal-point is comma.

data division.
working-storage section.
01 ponto-fixo  pic s9(013)v9(002) comp-3 value zeros.
01 float-curto                    comp-1 value zeros.
01 float-longo                    comp-2 value zeros.
01 delta-curto pic s9(013)v9(006) comp-3 value zeros.
01 delta-longo pic s9(013)v9(006) comp-3 value zeros.

01 valor-fixo pic zzz.zzz.zz9,99 value zeros.
01 valor-curto pic zzz.zzz.zz9,99 value zeros.
01 valor-longo pic zzz.zzz.zz9,99 value zeros.

procedure division.
inicio.

perform 5000000 times
    add 0,01 to ponto-fixo
    add 0,01 to float-curto
    add 0,01 to float-longo
end-perform

compute delta-curto = ponto-fixo - float-curto
compute delta-longo = ponto-fixo - float-longo

move ponto-fixo to valor-fixo
move float-curto to valor-curto
move float-longo to valor-longo

display "Ponto Fixo...: " valor-fixo
display "Float Curto..: " valor-curto " (delta " delta-curto ")"
display "Float Longo..: " valor-longo " (delta " delta-longo ")"

stop run.

Enquanto o campo decimal chega exatamente ao valor esperado (R$ 50.000,00), os campos com ponto flutuante apresentam diferenças — pequenas em cada operação, mas significativas no resultado final.

Ponto Fixo...: 50.000,00
Float Curto..: 52.159,66 (delta -0000000002159,667968)
Float Longo..: 49.999,99 (delta +0000000000000,000013)

Conclusão

É justamente por isso que campos com ponto flutuante são raros em sistemas comerciais escritos em COBOL. Eles fazem sentido em cenários científicos, estatísticos ou quando há necessidade de trabalhar com números muito grandes ou com ampla variação de magnitude — situações em que amplitude é mais importante do que precisão decimal absoluta.

Também podem aparecer em integrações com outras plataformas (Java, C, etc.), quando o sistema precisa gerar dados em formato compatível com essas linguagens.