Gibt es eine Software, die numerisch genaue Gleitkomma-C-Routinen aus symbolischen Formeln automatisch generieren kann?

25

Gibt es eine Software, die bei einer reellen Funktion von reellen Variablen automatisch numerisch genauen Code generiert, um die Funktion für alle Eingaben auf einer Maschine mit IEEE 754-Arithmetik zu berechnen?

Wenn zum Beispiel die zu bewertende reale Funktion wäre:

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

Die Software würde eine katastrophale Löschung und möglicherweise eine Suche nach Ausgabetabellen für bestimmte Sätze von Eingaben in Betracht ziehen, um einen Verlust an Rechengenauigkeit zu vermeiden.

Alternativ gibt es eine Software, die eine reine tabellenbasierte Suchroutine generiert, um eine gegebene Funktion mit hoher Genauigkeit zu berechnen?

Daniel Trebbien
quelle
5
Schweres Problem im Allgemeinen.
dmckee
1
Wenn das Problem speziell die Wurzelberechnung (oder Faktorisierung) von Polynomen betraf, gibt es da draußen einige C- (oder C ++ -) Bibliotheken.
Moala
2
Vielleicht möchten Sie die exzellente Artikelserie von Richard Harris in der ACCU- Zeitschrift Overload über The Floating Point Blues lesen . Ich habe sie auf Programmers.SX für Leute indiziert , die interessiert sein könnten.
Markieren Sie den Stand am

Antworten:

25

Die beste mir bekannte Lösung besteht darin, die symbolischen Ausdrücke in Mathematica , Maple oder SymPy zu programmieren . Alle Links führen direkt zur Dokumentation der Codegenerierung. Alle oben genannten Programme können Code in C oder Fortran generieren.

Keines der obigen Programme erwähnt die Genauigkeit in der IEEE 754-Arithmetik; Im Allgemeinen ist es schwierig, alle Quellen für eine katastrophale Annullierung vorherzusehen, wie @ dmckee feststellt. Es ist schwer, die Erfahrung des Menschen in der numerischen Analyse zu ersetzen.

Um ein konkretes Beispiel zu liefern, sollten Sie erwägen, die trigonometrischen Funktionen für beliebige Eingaben in mit hoher Genauigkeit zu berechnen . Dazu gibt es viele Strategien, einige sogar hardwareabhängig, wie im Wikipedia-Artikel Trigonometrische Tabellen beschrieben . Alle Algorithmen erfordern Einfallsreichtum und numerische Analyse, auch Algorithmen, die von Nachschlagetabellen und Taylor-Reihen oder Interpolation abhängen (siehe Wikipedia-Artikel Das Dilemma des Tischmachers ). Weitere Informationen finden Sie in der verwandten Frage zum Stapelüberlauf. Wie funktionieren trigonometrische Funktionen? .[0,2π]

Software, die Code oder Routinen generiert, um beliebige Funktionen mit hoher Genauigkeit zu berechnen, müsste nicht nur Löschfehler berücksichtigen, sondern auch Serienapproximanten (Taylor, Padé, Chebyshev, Rational usw.) zur Berechnung von Funktionen, die nicht im Sinne von definiert sind eine endliche Anzahl von Additionen, Subtraktionen, Multiplikationen, Divisionen und Bitverschiebungen. (Siehe Approximationstheorie .)

Geoff Oxberry
quelle
4
"Es ist schwer, das Fachwissen des Menschen in der numerischen Analyse zu ersetzen." - das allein verdient eine +1.
JM
"Es ist schwer" ist nicht dasselbe wie "es ist unmöglich". Es gibt "Vollbeschäftigungssätze" für einige Jobs (zB Compiler-Autoren). Gibt es eine für numerische Analysten?
Pseudonym
Ja. Reis-Theorem .
Geoff Oxberry
14

Wenn Sie eine Vorstellung davon haben möchten, wie weit wir von einem solchen Softwarepaket entfernt sind, lesen Sie bitte die LAPACK-Arbeitshinweise von 2001 zur zuverlässigen und effizienten Berechnung von Givens-Rotationen . Ich würde erwarten, dass die meisten Nichtspezialisten (und viele Spezialisten!) In der numerischen Analyse erstaunt sind, wie viel Analyse in die Lösung eines scheinbar einfachen Problems gesteckt hat:

f,gCcRsC

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

R(c,s)

Jack Poulson
quelle
1
+1 Dies ist ein großartiges Beispiel, danke. Ich denke, wenn es eine Lösung für reelle Zahlen gibt, könnte sie an komplexe Zahlen angepasst werden.
Daniel Trebbien
Ich sollte wahrscheinlich erwähnen, dass die grundlegende Schwierigkeit nicht in der Tatsache besteht, dass s komplex sein kann, sondern darin, unnötigen Überlauf und / oder Unterlauf zu vermeiden. Es hängt mit der Hypot-Funktion zusammen: en.wikipedia.org/wiki/Hypot
Jack Poulson
11

Die Codegenerierung und Vorkompilierung mathematischer Ausdrücke wird immer beliebter.

Während symbolische Pakete wie SymPy, Mathematica und Maple möglicherweise die Codegenerierung beinhalten, bin ich nicht sicher, dass sich auch eines von ihnen Gedanken über Numerik macht.

Es gibt noch einige andere Projekte, die sich sowohl für Symbolik als auch für Numerik interessieren.

Theano ist ein solches Projekt, das sich auf Array-Operationen konzentriert. Sie identifizieren und ersetzen einige Operationen, von denen bekannt ist, dass sie numerisch schlecht konditioniert sind. Ich bin mir nicht sicher, ob dies Ihren speziellen Fall einschließt, aber es lohnt sich, darüber nachzudenken.

Spirale könnte Sie auch interessieren. Sie kompilieren auch einen abstrakten Syntaxbaum vor und achten auf numerische Probleme. Sie befassen sich eher mit skalaren Operationen (wie in Ihrem Beispiel). Sie sind jedoch auch ziemlich auf eine bestimmte Domäne spezialisiert.

Das Wachstum in diesem Bereich ist jedoch ermutigend. Man kann optimistisch sein, dass Ihre Frage in ein paar Jahren eine bessere Antwort haben wird.

MRocklin
quelle
2
Einverstanden; Vielleicht war meine Antwort zu pessimistisch, da es viele domänenspezifische Lösungen gibt, aber das allgemeine Problem ist ... schwer.
Jack Poulson
4

Nicht generell kann ich mit Sicherheit sagen, dass der Implementierer des Codegenerators in SymPy nicht einmal = P ausprobiert hat.

Paolo Bientinesi entwickelte eine Methode zur Erzeugung von Stabilitätsnachweisen für lineare Algebra-Algorithmen, die unter Verwendung der FLAME-Notation von Robert van de Geijn erstellt werden.

Lesen Sie dieses Papier oder eine längere Arbeitsnotizversion .

aterrel
quelle
1

Mit Sage können Sie Formeln in Cython (einer Variante von Python, die C-Code generiert) ausdrücken. Zur Beantwortung Ihrer allgemeineren Frage: Nein. Betrachten wir den Satz von Rice .

mda
quelle