1 Introdução: O abismo entre matemática e computação
Na matemática, operamos com números reais em precisão infinita. O conjunto \(\mathbb{R}\) é denso: entre dois reais quaisquer existe sempre outro real. Podemos trabalhar com \(\pi\), \(e\), ou \(\sqrt{2}\) sem restrições.
No computador, tudo muda.
Um computador tem memória finita. Se cada número real precisasse de infinitos dígitos para representação exata, seria impossível armazená-lo. Logo, todo número é uma aproximação.
1.1 Por que isso importa para Cálculo Numérico
Erros de arredondamento — cada operação introduz pequenos erros
Propagação de erros — erros crescem ao longo de algoritmos
Instabilidade numérica — alguns algoritmos amplificam erros, outros os controlam
Escolha de método — um algoritmo “bom” matematicamente pode ser ruim em máquina
AvisoExemplo clássico
Resolver \(x^2 - 1000x + 1 = 0\) com a fórmula de Bhaskara pode resultar em catastrófica perda de dígitos significativos devido a cancelamento numérico.
2 Sistemas de Numeração Posicional
2.1 Base decimal (base 10)
Um número em base 10 é representado como: \[N = d_n \cdot 10^n + d_{n-1} \cdot 10^{n-1} + \cdots + d_1 \cdot 10 + d_0 + d_{-1} \cdot 10^{-1} + \cdots\]
Nem todo número decimal tem representação binária finita!
Por exemplo, \((0.1)_{10} = (0.0001100110011\ldots)_2\) é dízima periódica infinita.
Implicação: 0.1 não pode ser representado exatamente em computador!
Ver código
# Demonstração: 0.1 não é exato em bináriox =0.1print(f"0.1 em Python (16 casas): {x:.16f}")print(f"0.1 em Python (20 casas): {x:.20f}")# Isso causa problemasprint(f"\n0.1 + 0.2 = {0.1+0.2:.20f}")print(f"Esperado: 0.3")
0.1 em Python (16 casas): 0.1000000000000000
0.1 em Python (20 casas): 0.10000000000000000555
0.1 + 0.2 = 0.30000000000000004441
Esperado: 0.3
3 Inteiros em Máquina: Aritmética de Ponto Fixo
3.1 Inteiros sem sinal (unsigned integers)
Um inteiro sem sinal com \(n\) bits pode representar inteiros de \(0\) a \(2^n - 1\).
Bits
Intervalo
Uso
8
[0, 255]
1 byte
16
[0, 65535]
2 bytes
32
[0, 4.3 × 10⁹]
4 bytes
64
[0, 1.8 × 10¹⁹]
8 bytes
3.2 Inteiros com sinal: Complemento de dois
Padrão moderno para representar negativos (sem ambiguidade).
Um inteiro com sinal em \(n\) bits é representado por: \[N = -b_{n-1} \cdot 2^{n-1} + \sum_{i=0}^{n-2} b_i \cdot 2^i\]
onde o bit mais significativo (MSB) é o bit de sinal.
Intervalo:\(-2^{n-1}\) a \(2^{n-1} - 1\)
DicaExemplo com 8 bits
\((00000101)_2 = 5\)
\((11111011)_2 = -5\)
\((10000000)_2 = -128\) (menor valor)
\((01111111)_2 = 127\) (maior valor)
Intervalo:\([-128, 127]\)
3.3 Overflow inteiro
Se o resultado de uma operação inteira exceder o intervalo representável, ocorre overflow.
AvisoComportamentos diferentes por linguagem
C/Fortran: comportamento indefinido ou truncamento silencioso
Python: inteiros crescem dinamicamente (sem overflow)
Java: wraparound (volta ao intervalo válido)
Cuidado: Em linguagens compiladas, overflow silencioso é perigoso!
4 Números Reais em Máquina: Ponto Flutuante
4.1 Notação científica
Em matemática, qualquer número real pode ser escrito em notação científica: \[x = \pm d_0.d_1 d_2 d_3 \ldots \times 10^e\]
onde \(d_0 \in \{1, 2, \ldots, 9\}\) (um dígito antes do ponto) e \(e\) é o expoente.
Exemplo:\(1234.56 = 1.23456 \times 10^3\)
4.2 Representação de ponto flutuante normalizada
Em base 2, um número de ponto flutuante tem a forma: \[x = \pm (1.d_1 d_2 d_3 \ldots) \times 2^e\]
onde: - O bit implícito na posição \(2^0\) é sempre 1 (em representação normalizada) - \(d_i \in \{0, 1\}\) são os dígitos da mantissa (ou fração) - \(e\) é o expoente
Precisão total:\(p + 1\) dígitos binários (o “+1” é o bit implícito)
5 Padrão IEEE 754
IEEE 754 (IEEE Standard for Floating-Point Arithmetic) é o padrão internacional para aritmética de ponto flutuante. Garante consistência entre plataformas.
5.1 Formatos principais
Tipo
Bits
Sinal
Exp
Mant
Bias
Uso
float32
32
1
8
23
127
Gráficos, GPUs
float64
64
1
11
52
1023
Ciência, padrão Python
float80
80
1
15
64
16383
Cálculos intermediários
NotaFoco neste curso
Trabalharemos principalmente com float64 (precisão dupla, 64 bits), que é o padrão em Python, MATLAB e linguagens científicas.
Isto fornece underflow gradual ao invés de queda abrupta para zero.
6 Precisão e Erros de Máquina
6.1 Machine epsilon (\(\epsilon\))
Definição: Menor número \(\epsilon\) tal que \(1 + \epsilon \neq 1\) em aritmética de ponto flutuante.
Fórmula:\[\epsilon = 2^{-p}\]
onde \(p\) é o número de dígitos binários de precisão (após o bit implícito).
Formato
\(p\)
Machine epsilon
Valor aproximado
float32
24
\(2^{-23}\)
\(1.19 \times 10^{-7}\)
float64
53
\(2^{-52}\)
\(2.22 \times 10^{-16}\)
AvisoInterpretação
Machine epsilon é uma medida da precisão relativa: em máquina, qualquer número é representado com erro relativo no máximo da ordem de \(\epsilon / 2\).