Translate

quinta-feira, 21 de maio de 2026

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

 


Bellacosa Mainframe uso de ponto flutuante em cobol

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

Essa pergunta parece simples… mas toca em um dos temas mais profundos da arquitetura dos sistemas corporativos.

A verdade é que:

O COBOL foi criado para o mundo financeiro.
E o mundo financeiro NÃO tolera erro decimal.

Enquanto linguagens científicas valorizam amplitude numérica e velocidade matemática, o COBOL nasceu em bancos, seguradoras, folha de pagamento, contabilidade e governo — ambientes onde 1 centavo errado pode virar um desastre jurídico, contábil e operacional.

E é exatamente aí que o ponto flutuante começa a se tornar um problema.


O QUE É PONTO FLUTUANTE?

Quando falamos em COMP-1 e COMP-2, estamos falando de números armazenados em formato binário exponencial, parecido com IEEE Floating Point usado em C, Java, Python e hardware matemático.

Em vez de armazenar:

50000.00

o computador guarda algo próximo de:

mantissa × base^expoente

Exemplo conceitual:

5.000000 × 10^4

Isso permite:

✅ números gigantescos
✅ cálculos rápidos
✅ grande amplitude matemática
✅ excelente uso científico

Mas cria um problema clássico:

❌ muitos decimais NÃO existem exatamente em binário.


O GRANDE VILÃO: BINÁRIO NÃO REPRESENTA DECIMAL DIREITO

O mesmo problema ocorre em quase TODAS as linguagens.

Por exemplo:

0.1 + 0.2

Em várias linguagens o resultado interno vira:

0.30000000000000004

Porque:

0.1 decimal

não possui representação binária exata.

É parecido com tentar representar:

1/3

em decimal.

Você obtém:

0.333333333333...

Ou seja:

  • decimal sofre para representar certas frações binárias

  • binário sofre para representar certas frações decimais

E dinheiro é DECIMAL.


POR QUE ISSO É UM PESADELO EM SISTEMAS FINANCEIROS?

Imagine:

  • juros compostos

  • imposto

  • IOF

  • parcelamento

  • amortização

  • câmbio

  • atualização monetária

Agora imagine isso sendo executado:

  • milhões de vezes

  • durante décadas

  • em batchs gigantescos

  • conciliando bilhões

Se cada operação errar:

0.0000001

o erro acumulado explode.

Seu exemplo mostrou isso perfeitamente.


ANALISANDO O EXEMPLO

Seu programa é brilhante porque demonstra algo MUITO real:

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

Teoricamente:

5.000.000 × 0,01 = 50.000,00

O decimal fixo (COMP-3) chega exatamente nisso.

Mas observe os floats:

Float Curto..: 52.159,66
Float Longo..: 49.999,99

O COMP-1 ficou MAIS DE DOIS MIL REAIS errado.

Isso assusta muita gente iniciante.

Mas faz total sentido tecnicamente.


POR QUE O COMP-1 ERRA TANTO?

Porque ele possui apenas cerca de:

7 dígitos de precisão

E seu processamento acumulou arredondamentos continuamente.

O computador não está “errando”.

Ele está armazenando aproximações sucessivas.

Exemplo simplificado:

0,01

internamente pode virar:

0,0099999997

ou:

0,0100000003

Após milhões de somas:

💥 divergência enorme.


O COMP-2 É MELHOR… MAS AINDA NÃO É CONFIÁVEL

O COMP-2 usa 8 bytes.

Possui aproximadamente:

15~16 dígitos de precisão

Por isso o erro final ficou pequeno:

delta +0000000000000,000013

Mas para o mercado financeiro:

“quase certo” ainda significa ERRADO.

Em banco:

  • 0,01 errado é incidente

  • 0,001 errado é problema

  • 0,000013 errado pode quebrar conciliação

Mainframe não trabalha com “praticamente”.

Ele trabalha com:

✅ exatidão auditável
✅ rastreabilidade
✅ conformidade legal
✅ precisão contábil


POR ISSO O COBOL AMA COMP-3

O verdadeiro rei do mundo financeiro é:

PACKED DECIMAL

ou:

COMP-3

Porque ele armazena os dígitos DECIMAIS diretamente.

Exemplo:

PIC S9(7)V99 COMP-3

Armazena:

12345,67

como decimal compactado.

Sem conversão binária aproximada.

Resultado:

✅ precisão absoluta
✅ cálculos exatos
✅ sem erro acumulativo
✅ ideal para dinheiro


O QUE O COMP-3 SACRIFICA?

Ele perde em:

  • velocidade matemática bruta

  • amplitude numérica

  • cálculos científicos

Mas ganha no que importa ao negócio:

✅ confiabilidade financeira

E essa foi a prioridade histórica do COBOL.


O HARDWARE IBM FOI FEITO PARA ISSO

Aqui entra algo MUITO interessante da arquitetura IBM Z.

Os mainframes possuem instruções de hardware específicas para decimal packed.

Não é “emulação lenta”.

O próprio processador IBM Z possui:

  • decimal arithmetic instructions

  • packed decimal engine

  • decimal floating point support (mais moderno)

  • instruções financeiras especializadas

Ou seja:

o hardware foi literalmente desenhado para contabilidade.

Isso é um diferencial gigantesco do mundo mainframe.


POR QUE LINGUAGENS MODERNAS USAM FLOAT O TEMPO TODO?

Porque muitas aplicações modernas:

  • gráficos

  • IA

  • jogos

  • física

  • machine learning

  • rendering

  • estatística

não precisam de precisão decimal absoluta.

Para um jogo:

x = 14.99999997

não importa.

Para uma animação:

0.3000000004

é irrelevante.

Já num banco:

💀 isso vira reconciliação quebrada.


COBOL E O TRAUMA HISTÓRICO DOS CENTAVOS

Existe uma regra não escrita no mundo corporativo:

“Nunca use float para dinheiro.”

Isso veio de décadas de incidentes reais.

Sistemas antigos em C, Java e VB frequentemente causavam:

  • divergência bancária

  • erros de fechamento

  • problemas fiscais

  • falhas de arredondamento

  • diferenças em lote

Por isso Java criou:

BigDecimal

C# criou:

decimal

Python recomenda:

Decimal

Todos tentando reproduzir a filosofia do COBOL.


O PARADOXO

Curiosamente:

o COBOL estava CERTO desde os anos 60.

Enquanto outras linguagens correram atrás depois.

O modelo COBOL de:

✅ decimal fixo
✅ precisão absoluta
✅ representação financeira
✅ aritmética decimal

era exatamente o que sistemas corporativos precisavam.


MAS ENTÃO COMP-1 E COMP-2 SERVEM PARA QUÊ?

Eles existem principalmente para:


1. Aplicações científicas

Exemplo:

  • engenharia

  • estatística

  • meteorologia

  • cálculos atuariais

  • física


2. Integração com outras linguagens

Exemplo:

  • C

  • Java JNI

  • APIs numéricas

  • cálculos externos


3. Processamento matemático de alta amplitude

Exemplo:

6.022 × 10^23

número de Avogadro.

Impossível com decimal fixo convencional.


4. Dados vindos de hardware externo

Exemplo:

  • sensores

  • telemetria

  • cálculos industriais


O COBOL MODERNO E DECIMAL FLOATING POINT

Aqui entra algo avançado.

Os IBM Z modernos suportam:

  • Decimal Floating Point (DFP)

  • IEEE 754R decimal

  • hardware decimal floating

Isso tenta unir:

✅ amplitude
✅ velocidade
✅ precisão decimal

Mas mesmo assim:

em aplicações financeiras clássicas o COMP-3 continua soberano.

Porque ele é previsível, auditável e historicamente confiável.


UM DETALHE IMPORTANTE: ORDEM DAS OPERAÇÕES

Com float, até a ordem das somas pode mudar o resultado.

Exemplo:

(A + B) + C

pode ser diferente de:

A + (B + C)

Isso acontece por arredondamentos intermediários.

Em processamento paralelo isso vira um inferno.

Já decimal fixo reduz drasticamente esse problema.


OUTRA QUESTÃO CRÍTICA: COMPARAÇÃO

Em float:

IF VALOR = 0.3

pode falhar.

Porque internamente:

0.30000000000004

Isso causa bugs clássicos.

Por isso sistemas científicos usam tolerância:

ABS(A-B) < epsilon

Mas imagine isso em contabilidade.

💀 inviável.


O QUE UM PROGRAMADOR MAINFRAME APRENDE CEDO

O desenvolvedor COBOL veterano aprende rapidamente:

✅ dinheiro → COMP-3
✅ contador → COMP
✅ flags → DISPLAY/COMP
✅ float → evitar

É quase uma cultura histórica do mundo IBM.


RESUMO FINAL

COMP-1 / COMP-2 são ótimos para:

✅ ciência
✅ estatística
✅ amplitude numérica
✅ interoperabilidade
✅ cálculos matemáticos extremos


Mas são perigosos para:

❌ dinheiro
❌ contabilidade
❌ juros
❌ impostos
❌ conciliação
❌ sistemas bancários


A GRANDE LIÇÃO

O COBOL não evita ponto flutuante por limitação.

Ele evita porque:

precisão financeira vale mais que velocidade matemática.

E essa decisão arquitetural ajudou o mainframe a sustentar por décadas:

  • bancos

  • bolsas de valores

  • cartões

  • previdência

  • sistemas fiscais

  • compensação bancária

  • processamento financeiro global

com um nível de confiabilidade que poucas plataformas conseguiram igualar.

Sem comentários:

Enviar um comentário