Relevância dos cálculos de precisão de ponto fixo e arbitrário


10

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?

Relacionado: isso e isso


Milind R, obrigado pela sua pergunta. Acho que sua pergunta é interessante, mas provavelmente inadequada para o site. Peço que você consulte as Perguntas frequentes do site para obter orientação. Quando olho para sua pergunta, tenho a impressão de que é o começo de um discurso retórico, apesar de achar que os elementos de uma pergunta apropriada ao site estão presentes. Vale a pena perguntar se existem muitas aplicações da aritmética inteira e da aritmética de ponto fixo na ciência da computação e pedir uma comparação dessas aritméticas com o ponto flutuante. Encorajo a edição de sua postagem.
Geoff Oxberry

Sim, nasceu de um discurso retórico, mas eu o expressei como uma justificativa para o status quo. Minha pergunta, como você pode supor, é sobre por que não podemos ter uma grande mudança em direção a números inteiros e pontos fixos em números numéricos intensivos. Você pode editá-lo em meu nome? Eu realmente tentei, mas não sei como minha pergunta não é apropriada.
Milind R

5
Acho que há uma resposta técnica objetiva para isso: se você executar quase qualquer cálculo científico (por exemplo, uma solução linear), o número de bits necessários para o armazenamento exato aumenta exponencialmente com o tempo. Portanto, um forte apoio à inexatidão é necessário para um trabalho útil.
Geoffrey Irving

@MilindR: A comunidade de geometria computacional está interessada em cálculos de números reais com alto desempenho e precisão ao mesmo tempo. Eu acho que todas as questões práticas relevantes para você podem ser observadas nesta área de pesquisa. Um exemplo que você pode procurar é a biblioteca LEDA.
Shuhalo 01/03

@GeoffreyIrving E quanto a zeros em matrizes triangulares? Eles não podem ser armazenados como algo diferente de ponto flutuante propenso a erros inexatos?
precisa

Respostas:


5

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.


4

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?


É frustrante admitir, mas sim, sua resposta basicamente crucifica o uso em larga escala da computação exata. Acho que não voltarei a ver tão floatcedo.
Milind R

@MilindR: Não tenho muita certeza do que você está buscando. Você parece ter um martelo e está frustrado por ninguém ter um prego ou achar que um martelo é uma ferramenta útil. Mas não é porque não gostamos de você - pensamos nessas questões por um longo tempo e simplesmente decidimos que a chave de fenda que temos é a ferramenta adequada. Não acho nada frustrante (a menos que você tenha um martelo), pois é apenas uma abordagem pragmática - por que usar aritmética exata quando fazemos apenas aproximações?
Wolfgang Bangerth

É frustrante porque um problema perfeitamente normal pode ser tão mal condicionado que é efetivamente insolúvel. Como também porque o ideal de precisão arbitrária parecia tão promissor, em comparação com a natureza inexata do ponto flutuante desde o armazenamento do valor até sua saída.
precisa

O problema é que os erros de arredondamento são extremamente difíceis de analisar. Percebi isso no dia em que comecei a aprender análise numérica e álgebra linear numérica. Portanto, um sistema que evite completamente o problema, tornando o condicionamento um problema, deve estar levando o mundo pela tempestade, certo? foi o pensamento. É claro que eu entendo as limitações, mas elas pareciam mais irritantes do que desordeiros. É como a dificuldade crescente de reduzir os transistores nos processadores. Sim, é difícil de analisar, mas a Intel ainda o faz.
precisa

11
Se um problema é tão mal condicionado que é difícil de resolver, sua solução não é estável a perturbações. Esse é um problema com o problema original, não com a representação de ponto flutuante. Sim, talvez você possa obter uma solução para o problema usando a representação exata. Mas a solução não é estável e, portanto, provavelmente não terá nada a ver com o que você realmente está procurando. Você está latindo na árvore errada se acha que a representação dos números é o problema.
precisa saber é o seguinte

3

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. :-)


Obrigado .. Link muito informativo e agradável. Mas o uso do ponto fixo, juntamente com a extensão limitada do arredondamento, resulta em resultados mais precisos? Como a representação em si é exata, ao contrário do ponto flutuante?
Milind R

11
Eu sugiro que você ataque o seu problema de outro ponto de vista. Na introdução à lógica, você aprende que há três partes na solução de um problema: definições, raciocínio e conclusão / resultado. Você provavelmente (como a maioria de nós) está muito acostumado a trabalhar principalmente na etapa "definições" da solução de problemas - geralmente pode "definir" seu problema; no entanto, se você ficar frustrado, ocasionalmente encontrará um tipo de problema mais difícil que requer mais trabalho na parte "raciocínio".
Mda3 Mar13

Eu apenas o entendo vagamente ... Não consigo ver onde posso "afastar" esse problema, o raciocínio é essencial.
precisa

Vários anos mais tarde, eu realmente compreender que você :-)
Milind R

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.