Existe software que possa gerar automaticamente rotinas C de ponto flutuante com precisão numérica a partir de fórmulas simbólicas?

25

Dada uma função real de variáveis ​​reais, existe um software disponível que possa gerar automaticamente código com precisão numérica para calcular a função em todas as entradas em uma máquina equipada com aritmética IEEE 754?

Por exemplo, se a função real a ser avaliada fosse:

f (a, b, c) = \ frac {-b - \ sqrt {b ^ 2 - 4ac}} {2a}

O software consideraria o cancelamento catastrófico e, possivelmente, pesquisas na tabela de saída para determinados conjuntos de entradas para evitar uma perda na precisão computacional.

Como alternativa, existe um software que pode gerar uma rotina de pesquisa pura baseada em tabela para calcular uma determinada função com alta precisão?

Daniel Trebbien
fonte
5
Problema difícil em geral.
dmckee
1
Se o problema tivesse sido especificamente sobre a computação raiz (ou fatoração) de polinômios, existem algumas bibliotecas C (ou C ++) por aí.
moala
2
Você pode conferir a excelente série de artigos de Richard Harris no periódico ACCU Overload about The Floating Point Blues . Eu os indexei no Programmers.SX para pessoas que possam estar interessadas.
Mark Booth

Respostas:

25

A melhor solução que eu conheço é programar as expressões simbólicas no Mathematica , Maple ou SymPy ; todos os links vão diretamente para a documentação de geração de código. Todos os programas acima podem gerar código em C ou Fortran.

Nenhum dos programas acima menciona precisão na aritmética IEEE 754; em geral, seria difícil prever todas as fontes de cancelamento catastrófico, como observa @dmckee. É difícil substituir a experiência humana em análise numérica.

Para fornecer um exemplo concreto, considere calcular as funções trigonométricas com alta precisão para entradas arbitrárias em . Existem muitas estratégias para fazê-lo, algumas até dependentes de hardware, como pode ser visto no artigo Trigonometric Tables da Wikipedia . Todos os algoritmos exigem engenhosidade e análise numérica, mesmo algoritmos que dependem de tabelas de pesquisa e séries ou interpolação de Taylor (consulte o artigo da Wikipedia O dilema do criador de tabelas ). Para obter mais detalhes, consulte a pergunta Estouro de pilha relacionada. Como funcionam as funções trigonométricas? .[0 0,2π]

O software que gerou código ou rotinas para calcular funções arbitrárias com alta precisão não precisaria apenas estar ciente dos erros de cancelamento, mas também aproximações em série (Taylor, Padé, Chebyshev, racional etc.) para calcular funções que não são definidas em termos de um número finito de adições, subtrações, multiplicações, divisões e mudanças de bits. (Veja Teoria da Aproximação .)

Geoff Oxberry
fonte
4
"É difícil substituir a experiência humana em análise numérica". - isso por si só merece um +1.
JM
"É difícil" não é a mesma coisa que "é impossível". Existem "teoremas de pleno emprego" para alguns trabalhos (por exemplo, escritores de compiladores). Existe um para analistas numéricos?
Pseudônimo
Sim. Teorema de Rice .
achou
14

Se você quiser ter uma idéia de quão longe estamos de um pacote de software, consulte a nota de trabalho do LAPACK 2001 sobre o cálculo das rotações da Givens de maneira confiável e eficiente . Eu esperaria que a maioria dos não especialistas (e muitos especialistas!) Em análise numérica se surpreendesse com a quantidade de análise que foi aplicada na solução de um problema tão aparentemente simples:

f,gCcRsC

R(c,s)[fg]=[cs-s¯c][fg]=[r0 0]

R(c,s)

Jack Poulson
fonte
1
+1 Este é um ótimo exemplo, obrigado. Eu acho que se existisse uma solução para reais, ela poderia ser adaptada a números complexos.
Daniel Trebbien
Eu provavelmente deveria mencionar que a dificuldade fundamental não está no fato de que s pode ser complexo, mas em evitar o excesso e / ou o excesso de fluxo desnecessários. Ela está relacionada com a função hypot: en.wikipedia.org/wiki/Hypot
Jack Poulson
11

A geração de código e a pré-compilação de expressões matemáticas estão se tornando mais populares.

Embora pacotes simbólicos como SymPy, Mathematica e Maple possam incluir geração de código, não estou confiante de que algum deles também pense muito sobre números.

Existem alguns outros projetos que podem ser pesquisados, interessados ​​tanto em simbólicos quanto em numéricos.

O Theano é um projeto focado em operações de matriz. Eles identificam e substituem algumas operações conhecidas por serem numericamente mal condicionadas. Não tenho certeza de que isso inclua seu caso específico, mas vale a pena investigar.

Espiral também pode ser interessante para você. Eles também pré-compilam uma árvore de sintaxe abstrata e também procuram problemas numéricos. Eles estão mais preocupados com operações escalares (como o seu exemplo). No entanto, eles também são bastante especializados em um domínio específico.

O crescimento neste campo é encorajador, no entanto. Pode-se estar otimista de que sua pergunta terá uma resposta melhor em alguns anos.

MRocklin
fonte
2
Acordado; talvez minha resposta tenha sido muito pessimista, pois existem muitas soluções específicas de domínio, mas o problema geral é ... difícil.
precisa
4

Em geral, não posso dizer com segurança que o implementador do gerador de código no SymPy nem tentou = P.

Paolo Bientinesi desenvolveu um método para gerar provas de estabilidade de algoritmos de álgebra linear, que são gerados usando a notação FLAME de Robert van de Geijn.

Veja este documento , ou uma versão mais longa da nota de trabalho .

aterrel
fonte
1

O Sage permite que você expresse fórmulas no Cython (uma variante do python que gera código C); no entanto, em resposta à sua pergunta mais geral: não. Considere o teorema de Rice .

mda
fonte