Existe-t-il un logiciel capable de générer automatiquement des routines C à virgule flottante à précision numérique à partir de formules symboliques?

25

Étant donné une fonction réelle de variables réelles, existe-t-il un logiciel capable de générer automatiquement un code numérique précis pour calculer la fonction sur toutes les entrées d'une machine équipée de l'arithmétique IEEE 754?

Par exemple, si la fonction réelle à évaluer était:

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

Le logiciel prendrait en compte l'annulation catastrophique et éventuellement les recherches de table de sortie pour certains ensembles d'entrées afin d'éviter une perte de précision de calcul.

Sinon, existe-t-il un logiciel qui peut générer une routine de recherche basée sur une table pure pour calculer une fonction donnée avec une grande précision?

Daniel Trebbien
la source
5
Problème difficile en général.
dmckee
1
Si le problème concernait spécifiquement le calcul (ou la factorisation) racine des polynômes, il existe des bibliothèques C (ou C ++).
moala
2
Vous voudrez peut-être consulter l'excellente série d'articles de Richard Harris dans le journal ACCU Overload sur The Floating Point Blues . Je les ai indexés sur Programmers.SX pour les personnes qui pourraient être intéressées.
Mark Booth

Réponses:

25

La meilleure solution que je connaisse est de programmer les expressions symboliques dans Mathematica , Maple ou SymPy ; tous les liens vont directement à la documentation de génération de code. Tous les programmes ci-dessus peuvent générer du code en C ou en Fortran.

Aucun des programmes ci-dessus ne mentionne l'exactitude dans l'arithmétique IEEE 754; en général, il serait difficile d'anticiper toutes les sources d'annulation catastrophiques, comme le note @dmckee. Il est difficile de remplacer l'expertise humaine en analyse numérique.

Pour fournir un exemple concret, envisagez de calculer les fonctions trigonométriques avec une grande précision pour des entrées arbitraires dans . Il existe de nombreuses stratégies pour le faire, certaines dépendant même du matériel, comme le montre l'article Wikipédia Tables trigonométriques . Tous les algorithmes nécessitent de l'ingéniosité et une analyse numérique, même des algorithmes qui dépendent des tables de recherche et des séries de Taylor ou de l'interpolation (voir l'article de Wikipedia The Table-Maker's Dilemma ). Pour plus de détails, voir la question de débordement de pile connexe Comment fonctionnent les fonctions trigonométriques? .[0,2π]

Les logiciels qui génèrent du code ou des routines pour calculer des fonctions arbitraires avec une grande précision devraient non seulement être conscients des erreurs d'annulation, mais également des approximateurs de séries (Taylor, Padé, Chebyshev, rationnel, etc.) pour calculer des fonctions qui ne sont pas définies en termes de un nombre fini d'additions, de soustractions, de multiplications, de divisions et de décalages de bits. (Voir Théorie de l'approximation .)

Geoff Oxberry
la source
4
"Il est difficile de remplacer l'expertise humaine en analyse numérique." - cela seul mérite un +1.
JM
"C'est dur" n'est pas la même chose que "c'est impossible". Il existe des "théorèmes du plein emploi" pour certains emplois (par exemple les rédacteurs de compilateurs). Y en a-t-il un pour les analystes numériques?
Pseudonyme
Oui. Théorème de Rice .
Geoff Oxberry
14

Si vous voulez avoir une idée de la distance qui nous sépare d'un tel progiciel, veuillez consulter la note de travail 2001 de LAPACK sur le calcul fiable et efficace des rotations Givens . Je m'attendrais à ce que la plupart des non-spécialistes (et de nombreux spécialistes!) En analyse numérique soient surpris de voir à quel point l'analyse a permis de résoudre un problème aussi simple:

f,gCcRsC

R(c,s)[fg]=[css¯c][fg]=[r0]

R(c,s)

Jack Poulson
la source
1
+1 Ceci est un excellent exemple, merci. Je suppose que s'il existait une solution pour les réels, elle pourrait être adaptée à des nombres complexes.
Daniel Trebbien
Je devrais probablement mentionner que la difficulté fondamentale n'est pas dans le fait que les s peuvent être complexes, mais pour éviter un débordement et / ou un débordement inutiles. Elle est liée à la fonction hypot: en.wikipedia.org/wiki/Hypot
Jack Poulson
11

La génération de code et la précompilation d'expressions mathématiques deviennent de plus en plus populaires.

Alors que les packages symboliques tels que SymPy, Mathematica et Maple peuvent inclure la génération de code, je ne suis pas sûr que l'un d'entre eux pense également aux chiffres.

Il y a quelques autres projets sur lesquels on pourrait s'intéresser à la fois en symbolique et en numérique.

Theano est un tel projet axé sur les opérations de baie. Ils identifient et remplacent certaines opérations connues pour être numériquement mal conditionnées. Je ne suis pas certain que cela inclue votre cas spécifique, mais cela vaut la peine d'être examiné.

La spirale pourrait également vous intéresser. Ils précompilent également un arbre de syntaxe abstraite et recherchent également les problèmes numériques. Ils sont plus concernés par les opérations scalaires (comme votre exemple). Cependant, ils sont également assez spécialisés dans un domaine particulier.

La croissance dans ce domaine est cependant encourageante. On peut être optimiste que votre question aura une meilleure réponse dans quelques années.

MRocklin
la source
2
D'accord; peut-être que ma réponse est apparue trop pessimiste, car il existe de nombreuses solutions spécifiques au domaine, mais le problème général est ... difficile.
Jack Poulson
4

Pas en général, je peux dire en toute sécurité que l'implémenteur du générateur de code dans SymPy n'a même pas essayé = P.

Paolo Bientinesi a développé une méthode pour générer des preuves de stabilité d'algorithmes d'algèbre linéaire, qui sont générés en utilisant la notation FLAME de Robert van de Geijn.

Voir cet article ou une version plus longue de note de travail .

aterrel
la source
1

Sage vous permet d'exprimer des formules en Cython (une variante de python qui génère du code C); cependant, en réponse à votre question plus générale: non. Considérez le théorème de Rice .

mda
la source