Variáveis “reais”: comparações e erros de aproximação

  • um double é armazenado (simplificadamente) como dois números inteiros, uma mantissa e um expoente, semelhante ao formato de constantes com expoente
    • assim como em ints, esses números inteiros têm certos limites de tamanho
    • muitos números reais, mesmo que “simples”, não podem ser representados de forma exata, mas apenas de forma aproximada
    • double’s são chamados de números de ponto flutuante (floating-point numbers)
    • mais detalhes, exemplos e visualizações [1, 2]
  • “solução” ingênua: fazer comparações permitindo erros/tolerâncias. Por exemplo:
    • digamos que nossa tolerância a erros é double tol = 1e-6;
    • vamos considerar um double z como “(quase) zero” se estiver no intervalo (-tol,+tol)
    • isso pode ser testado com a condição z < tol && -z < tol
    • podemos verificar se doubles x e y são “(quase) iguais” testando se x-y é “(quase) zero”, ou seja, x-y < tol && y-x < tol