Pular para conteúdo

Aula 19 - Representação de Ponto Flutuante IEEE 754 🧮

Objetivo Pedagógico

Objetivo: Estrutura interna de números reais na computação segundo o padrão IEEE 754 (Single Precision 32-bit e Double Precision 64-bit), sinal, expoente com bias, mantissa e erros de arredondamento.


📑 1. Fundamentos Teóricos & Análise Técnica

Diferente dos números inteiros (que possuem representação exata em complemento de dois), os números reais contínuos são infinitos e não cabem de forma precisa em palavras de memória finitas de 32 ou 64 bits. O padrão internacional IEEE 754 (estabelecido em 1985) padronizou a representação de Ponto Flutuante (Floating Point).

Na representação de Precisão Simples (32 bits - float): - 1 bit de Sinal (\(s\)): 0 para positivo, 1 para negativo. - 8 bits de Expoente (\(e\)): Armazenado com um Bias (Viés) de 127, permitindo representar expoentes positivos e negativos sem bit extra de sinal. O expoente real é dado por \(E = e - 127\). - 23 bits de Mantissa/Fração (\(m\)): Representa os dígitos significativos com um bit implícito leading bit '1' normalizado (\(1.m\)).

O valor decimal correspondente é calculado pela fórmula: $\(V = (-1)^s imes 2^{e - 127} imes (1 + m)\)$

Consequência fundamental de engenharia: números como \(0.1\) em base decimal tornam-se dízimas periódicas infinitas em base binária (\(0.0001100110011..._2\)), explicando por que expressões como 0.1 + 0.2 == 0.3 resultam em false na maioria das linguagens de programação.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph LR
    Float32["Palavra de 32 bits (IEEE 754 Single Precision)"] --> Sign["Bit 31: Sinal (1 bit)"]
    Float32 --> Exp["Bits 30-23: Expoente com Bias 127 (8 bits)"]
    Float32 --> Mantissa["Bits 22-0: Fração / Mantissa Normalizada (23 bits)"]
    Sign --> Formula["(-1)^S * 2^(E-127) * (1.M)"]
    Exp --> Formula
    Mantissa --> Formula
    style Float32 fill:#e3f2fd,stroke:#1565c0
    style Sign fill:#ffebee,stroke:#c62828
    style Exp fill:#fff3e0,stroke:#e65100
    style Mantissa fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Normalização Científica: Economia de 1 bit através da omissão do dígito 1 antes da vírgula binária (hidden bit). - Valores Especiais: Representações padronizadas para \(+\infty\), \(-\infty\), \(+0\), \(-0\) e \(NaN\) (Not a Number). - Subnormalidade e Epsilon de Máquina: Tratamento de números extremamente próximos de zero para evitar underflow abrupto. - Erros Cumulativos de Arredondamento: Necessidade obrigatória de tipos decimais de ponto fixo (como BigDecimal) em sistemas contábeis e financeiros.


🛠️ 2. Implementação Prática em Padrão IEEE 754 e Aritmética Computacional

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// ieee754_inspector.c (Desconstrução Bit a Bit de um Float em C)
#include <stdio.h>
#include <stdint.h>

// Union em C: permite inspecionar os mesmos 32 bits de memória como float ou inteiro
union FloatBits {
    float f;
    uint32_t bits;
};

void inspect_float(float val) {
    union FloatBits fb;
    fb.f = val;

    uint32_t sign = (fb.bits >> 31) & 1;
    uint32_t exponent = (fb.bits >> 23) & 0xFF;
    uint32_t mantissa = fb.bits & 0x7FFFFF;

    printf("Número: %f\n", val);
    printf("Bits Brutos: 0x%08X\n", fb.bits);
    printf("Sinal (1 bit): %u (%s)\n", sign, sign ? "Negativo" : "Positivo");
    printf("Expoente com Bias (8 bits): %u (Valor Real: %d)\n", exponent, (int)exponent - 127);
    printf("Mantissa (23 bits): 0x%06X\n\n", mantissa);
}

int main() {
    inspect_float(12.5f);
    inspect_float(-0.75f);
    return 0;
}

💡 Análise Passo a Passo do Código

  1. Uso de Union para Type Punning: Permite ler a memória de 32 bits de um float como um inteiro unsigned sem conversão de valor.
  2. Extração de Campos por Máscara: Operações de deslocamento e máscaras lógicas (& 0xFF, & 0x7FFFFF) separam sinal, expoente e mantissa.
  3. Cálculo do Bias: Subtração do viés (int)exponent - 127 revela a potência de dois exata multiplicada.

🎯 3. Próximos Passos & Sequência Didática