Encomenda de operação para maximizar a precisão dupla

Eu estou trabalhando em alguma ferramenta que consegue calcular números que podem chegar perto de 1e-25 nos piores casos, e compará-los juntos, em Java. Eu estou obviamente usando precisão dupla.

Eu li em outra resposta que eu não deveria esperar mais de 1e-15 a 1e-17 precisão, e essa outra questão lida com a obtenção de melhor precisão ao ordenar operações em uma ordem “melhor”.

Quais operações de precisão dupla estão mais dispostas a perder precisão ao longo do caminho? Devo tentar trabalhar com números tão grandes quanto possível ou tão pequenos quanto possível? Faça divisões primeiro antes das multiplicações?

Eu prefiro não usar as classs BigDecimal ou equivalente, já que o código já é lento o suficiente;) (a menos que eles não afetem muito a velocidade, é claro).

Qualquer informação será muito apreciada!

EDIT : O fato de que os números são “pequenos” em valor absoluto (1e-25) não importa, pois o dobro pode ir até 1e-324. Mas o que importa é que, quando são muito semelhantes (tanto em 1e-25), eu tenho que comparar, digamos, 4.64563824048517606458e-21 a 4.64563824048517606472e-21 (a diferença é o 19º e o 20º dígitos). Ao calcular esses números, a diferença é tão pequena que eu posso acertar o “erro de arredondamento”, onde o restante é preenchido com números randoms.

A questão é: “como ordenar o cálculo para que essa perda de precisão seja minimizada?”. Pode estar fazendo divisões antes de multiplicações ou adições primeiro.

Se é importante obter a resposta correta, você deve usar BigDecimal. É mais lento que o dobro, mas na maioria dos casos é rápido o suficiente. Não consigo pensar em muitos casos em que você faz muitos cálculos com números tão pequenos em que não importa se a resposta está correta – pelo menos com Java.

Se este for um aplicativo super sensível ao desempenho, consideraria usar um idioma diferente.

Obrigado ao @John por apontar um artigo muito completo sobre aritmética de ponto flutuante.

Acontece que, quando a precisão é necessária, as operações devem ser reordenadas e as fórmulas adaptadas para evitar a perda de precisão, como explicado no capítulo Cancelamento : ao comparar números muito próximos uns dos outros (que é o meu caso), “cancelamento catastrófico” pode ocorrer, induzindo uma enorme perda de precisão. Muitas vezes, rewrite a fórmula ou reordenar as operações de acordo com o seu conhecimento prévio dos valores dos operandos pode levar a uma maior precisão no cálculo.

O que vou lembrar deste artigo é:

  • tenha cuidado ao subtrair duas quantidades quase idênticas
  • tente reorganizar as operações para evitar o cancelamento catastrófico

Para o último caso, lembre-se de que a computação (x - y) * (x + y) fornece resultados mais precisos que x * x - y * y .

Intereting Posts