Eu vejo muito poucas bibliotecas / pacotes de computação de ponto não flutuante. Dadas as várias imprecisões da representação de ponto flutuante, surge a questão de por que não existem pelo menos alguns campos em que essa precisão aumentada pode valer os meandros de trabalhar com ponto fixo.
Existe alguma dificuldade MAIOR no uso, digamos, de um solucionador de autovalor de ponto fixo? Quão lento / rápido, impreciso / preciso eles seriam?
floating-point
numerics
Milind R
fonte
fonte
Respostas:
O uso da aritmética de ponto fixo pode ser apropriado sob certas circunstâncias. Geralmente para a computação científica (pelo menos no sentido em que a maioria das pessoas pensa), não é apropriado devido à necessidade de expressar as grandes faixas dinâmicas encontradas. Você menciona problemas de autovalor como um exemplo, mas, com frequência, na ciência, interessa-se nos menores autovalores de uma matriz (digamos, em calcular o estado fundamental de um sistema quântico). A precisão dos valores próprios pequenos geralmente será bastante deteriorada em relação aos valores próprios grandes se você usar um ponto fixo. Se sua matriz contiver entradas que variam por grandes proporções, os pequenos valores próprios podem ser completamente inexprimíveis na precisão de trabalho. Este é um problema com a representação de números; esses argumentos são válidos independentemente de como você faz os cálculos intermediários. Você poderia elaborar uma escala para aplicar aos resultados calculados, mas agora acabou de inventar o ponto flutuante. É fácil construir matrizes cujos elementos são bem comportados, mas cujos valores próprios são excessivamente mal comportados (comoMatrizes de Wilkinson , ou mesmo matrizes com entradas inteiramente inteiras ). Esses exemplos não são tão patológicos quanto podem parecer, e muitos problemas na vanguarda da ciência envolvem matrizes muito mal comportadas; portanto, usar um ponto fixo nesse contexto é uma Bad Idea (TM).
Você pode argumentar que conhece a magnitude dos resultados e deseja não desperdiçar bits no expoente, então vamos falar sobre os intermediários. O uso de ponto fixo geralmente exacerba os efeitos de cancelamentos e arredondamentos catastróficos, a menos que você realmente se esforce ao máximo para trabalhar com maior precisão. A penalidade de desempenho seria enorme e eu suporia que o uso de uma representação de ponto flutuante com a mesma largura de bit de mantissa seria mais rápido e preciso.
Uma área em que o ponto fixo pode brilhar é em certas áreas da computação geométrica. Especialmente se você precisar de aritmética exata ou conhecer antecipadamente a faixa dinâmica de todos os números, o ponto fixo permite que você aproveite todos os bits em sua representação. Por exemplo, suponha que você queira calcular a interseção de duas linhas e, de alguma forma, os pontos finais das duas linhas sejam normalizados para ficar no quadrado da unidade. Nesse caso, o ponto de interseção pode ser representado com mais bits de precisão do que usando um número de ponto flutuante equivalente (que desperdiçará bits no expoente). Agora, é quase certo que os números intermediários necessários neste cálculo precisam ser calculados com maior precisão ou, pelo menos, com muito cuidado (como ao dividir o produto de dois números por outro número, você precisa ter muito cuidado com isso ). Nesse sentido, o ponto fixo é mais vantajoso do ponto de vista da representação do que do ponto de vista computacional, e eu diria que isso geralmente é verdade quando você pode estabelecer limites superiores e inferiores definidos na faixa dinâmica das saídas do seu algoritmo . Isso acontece raramente.
Eu costumava pensar que as representações de ponto flutuante eram grosseiras ou imprecisas (por que desperdiçar bits em um expoente ?!). Mas, com o tempo, percebi que realmente é uma das melhores representações possíveis para números reais. As coisas da natureza aparecem em escalas de log; portanto, dados reais acabam abrangendo uma grande variedade de expoentes. Também para alcançar a maior precisão relativa possível, é necessário trabalhar em escalas de log, tornando o rastreamento de um expoente mais natural. O único outro candidato a uma representação "natural" é o índice de nível simétrico . No entanto, adição e subtração são muito mais lentas nessa representação e carece do suporte de hardware da IEEE 754. Uma quantidade enorme de pensamento foi colocada nos padrões de ponto flutuante, por um pilar de álgebra linear numérica. Eu acho que ele sabe qual é a representação "certa" dos números.
fonte
Como um exemplo de por que a aritmética exata / aritmética de ponto fixo é tão raramente usada, considere o seguinte:
No método dos elementos finitos, como em quase todos os outros métodos em uso na computação científica, chegamos a sistemas lineares ou não lineares que são apenas aproximações do mundo real. Por exemplo, no MEF, o sistema linear a ser resolvido é apenas uma aproximação à equação diferencial parcial parcial (que pode, por si só, ser apenas uma aproximação do mundo real). Então, por que colocar um enorme esforço em resolver algo que é apenas uma aproximação?
A maioria dos algoritmos que usamos hoje é de natureza iterativa: método de Newton, gradientes conjugados, etc. Nós terminamos essas iterações sempre que estivermos convencidos de que a precisão da iterativa aproximada da solução do problema é suficiente. Em outras palavras, terminamos antes de termos a solução exata. Como antes, por que usar a aritmética exata para um esquema iterativo quando sabemos que estamos apenas computando aproximações?
fonte
float
cedo.Se você procurar nesta biblioteca o arredondamento correto: CRlibm , verá na documentação que, geralmente, os algoritmos devem ser comprovadamente precisos (com provas fundamentadas). Por quê? A estabilidade e a velocidade de convergência de um resultado de uma função não têm uma resposta "tamanho único". Em suma, não há "almoço grátis" - você precisa trabalhar para provar que seu raciocínio está correto. Isso ocorre devido ao comportamento das funções que estão sendo modeladas, e não ao hardware subjacente (se você usa unidades de ponto flutuante ou inteiro, embora sim, ambas têm "dicas", como estouro / estouro, números desnormais etc.) Mesmo se o resultado você está procurando converge para um número inteiro, o algoritmo usado para encontrar o resultado não é necessariamente muito estável.
Eigen é uma biblioteca C ++ que possui uma variedade de algoritmos para resolver matrizes, cada um com propriedades diferentes. Esta página contém uma tabela que discute as compensações de velocidade versus precisão para os vários algoritmos usados para resolver uma matriz. Eu suspeito que a biblioteca Eigen pode fazer o que você quiser. :-)
fonte
Para alguns bons exemplos de onde a aritmética de alta precisão tem sido útil na matemática, dê uma olhada no livro Mathematics by Experiment, de Jonathan Borwein e David Bailey. Há também essa sequência , que eu não li.
fonte