A mitigação de erro de ponto flutuante é a minimização de erros causados pelo fato de que os números reais não podem, em geral, ser representados com precisão exata em um espaço fixo. Por definição, o erro de ponto flutuante não pode ser eliminado e, no melhor dos cenários, pode apenas ser gerenciado. Huberto M. Sierra observou em sua patente de 1956, "Controle de Aritmética de Ponto Decimal Flutuante para Calculadora":
Assim, sob algumas condições, a maior parte dos dígitos dos dados significativos pode estar além da capacidade dos registradores. Portanto, o resultado obtido pode ver pouca lógica, se não for totalmente errôneo.
O Z1, desenvolvido por Konrad Zuse em 1936, foi o primeiro computador com aritmética de ponto flutuante e, portanto, estava suscetível ao erro de ponto flutuante. Os primeiros computadores, no entanto, com tempos de operação medidos em milissegundos, não conseguiam resolver problemas grandes e complexos e, por isso, raramente eram assolados por erros de ponto flutuante. Hoje, contudo, com o desempenho dos sistemas de supercomputadores medido em petaflops, o erro de ponto flutuante é uma grande preocupação para quem resolve problemas computacionais. As seções a seguir descrevem os pontos fortes e fracos de vários meios de mitigação de erro de ponto flutuante.
Análise numérica de erros Embora não seja o foco principal da Análise numérica, a análise numérica de erros existe para a análise e minimização do erro de arredondamento de ponto flutuante.
Aritmética de Monte Carlo A análise de erros pela aritmética de Monte Carlo é realizada injetando repetidamente pequenos erros nos valores dos dados de um algoritmo e determinando o efeito relativo nos resultados.
Extensão de precisão A extensão de precisão consiste no uso de representações maiores de valores reais do que a inicialmente considerada. O padrão IEEE 754 define a precisão como o número de dígitos disponíveis para representar números reais. Uma linguagem de programação pode incluir precisão simples (32 bits), precisão dupla (64 bits) e precisão quádrupla (128 bits). Embora a extensão da precisão torne os efeitos do erro menos prováveis ou menos importantes, a verdadeira exatidão dos resultados ainda permanece desconhecida.
Aritmética de comprimento variável A aritmética de comprimento variável (ou precisão arbitrária) representa números como uma sequência de dígitos cujo comprimento da variável é limitado apenas pela memória disponível. As operações aritméticas de comprimento variável são consideravelmente mais lentas do que as instruções de ponto flutuante de formato de comprimento fixo. Quando o alto desempenho não é um requisito, mas a alta precisão é, a aritmética de comprimento variável pode ser útil, embora a exatidão real do resultado possa não ser conhecida.
Uso do termo de erro de uma operação de ponto flutuante Os algoritmos de ponto flutuante conhecidos como *TwoSum* ou *2Sum*, devidos a Knuth e Møller, e sua versão mais simples porém restrita, *FastTwoSum* ou *Fast2Sum* (3 operações em vez de 6), permitem obter o termo de erro (exato) de uma adição de ponto flutuante arredondada para o mais próximo. Também é possível obter o termo de erro (exato) de uma multiplicação de ponto flutuante arredondada para o mais próximo em 2 operações com uma instrução de multiplicação e adição fundidas (FMA), ou 17 operações se a FMA não estiver disponível (com um algoritmo devido a Dekker). Esses termos de erro podem ser usados em algoritmos para melhorar a precisão do resultado final, por exemplo, com expansões de ponto flutuante ou algoritmos compensados. Operações que fornecem o resultado de uma adição ou multiplicação de ponto flutuante arredondada para o mais próximo juntamente com seu termo de erro (mas diferindo ligeiramente dos algoritmos mencionados acima) foram padronizadas e recomendadas no padrão IEEE 754-2019.
Escolha de uma base diferente Alterar a base, em particular de binária para decimal, pode ajudar a reduzir o erro e controlar melhor o arredondamento em algumas aplicações, como aplicações financeiras.
Aritmética de intervalos A Aritmética de intervalos é uma técnica matemática usada para colocar limites em erros de arredondamento e erros de medição na computação matemática. Os valores são intervalos, que podem ser representados de várias maneiras, tais como:
inf-sup: um limite inferior e um limite superior para o valor real; mid-rad: uma aproximação e um limite de erro (chamados de *ponto médio* e *raio* do intervalo); triplex: uma aproximação, um limite inferior e um limite superior para o erro. "Em vez de usar un único número de ponto flutuante como aproximação para o valor de uma variável real no modelo matemático sob investigação, a aritmética de intervalos reconhece a precisão limitada ao associar à variável um conjunto de reais como valores possíveis. Para facilitar o armazenamento e o cálculo, esses conjuntos são restritos a intervalos." A avaliação de expressões de aritmética de intervalos pode fornecer uma ampla gama de valores, e pode superestimar seriamente os limites reais de erro.
Unums de Gustafson Os Unums ("Números Universais") são uma extensão da aritmética de comprimento variável proposta por John L. Gustafson. Os unums possuem campos de comprimento variável para os comprimentos do expoente e do significando, e as informações de erro são carregadas em um único bit, o *ubit*, que representa o erro possível no bit menos significativo do significando (ULP). A eficácia dos unums é questionada por William Kahan.
Ponto flutuante limitado O ponto flutuante limitado (bounded floating point) é um método proposto e patenteado por Alan Jorgensen. A estrutura de dados inclui a estrutura de dados e a interpretação padrão do IEEE 754, bem como informações sobre o erro entre o valor real real representado e o valor armazenado pela representação de ponto flutuante. O ponto flutuante limitado tem sido criticado por ser um derivado do trabalho de Gustafson em unums e aritmética de intervalos.
Referências