シンボリック式から数値的に正確な浮動小数点Cルーチンを自動生成できるソフトウェアはありますか?


25

実変数の実関数が与えられた場合、IEEE 754算術を搭載したマシンのすべての入力で関数を計算するための数値的に正確なコードを自動的に生成できるソフトウェアはありますか?

たとえば、評価される実関数が次の場合:

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

ソフトウェアは、致命的なキャンセルと、特定の入力セットの出力テーブル検索を考慮して、計算精度の低下を回避します。

あるいは、純粋なテーブルベースのルックアップルーチンを生成して、特定の関数を高精度で計算できるソフトウェアはありますか?


5
一般に難しい問題。
dmckee

1
問題が特に多項式のルート計算(または因数分解)に関するものであった場合、C(またはC ++)ライブラリがいくつかあります。
モアラ

2
あなたは内の記事のリチャード・ハリスの優れたシリーズをチェックアウトする場合がありますACCUジャーナル過負荷についての浮動小数点ブルース。私はそれらをインデックス付け興味があるかもしれません人々のためProgrammers.SXにオーバー。
マークブース

回答:


25

私が知っている最良の解決策は、MathematicaMaple、またはSymPyでシンボリック式をプログラムすることです。すべてのリンクは、コード生成ドキュメントに直接移動します。上記のプログラムはすべて、CまたはFortranでコードを生成できます。

上記のプログラムはいずれもIEEE 754算術の精度に言及していません。一般に、@ dmckeeが指摘しているように、壊滅的なキャンセルのすべての原因を予測することは困難です。数値解析で人間の専門知識を置き換えることは困難です。

具体的な例を提供するために任意の入力に対して高精度に三角関数を計算検討。Wikipediaの記事Trigonometric Tablesにあるように、そうするための多くの戦略があり、ハードウェアに依存するものもあります。すべてのアルゴリズムには、ルックアップテーブルやテイラー級数や補間に依存するアルゴリズムも含め、独創性と数値解析が必要です(Wikipediaの記事The Table-Maker's Dilemmaを参照)。詳細については、関連するスタックオーバーフローの質問「三角関数の仕組み」を参照してください[0,2π]

任意の関数を高精度で計算するためのコードまたはルーチンを生成したソフトウェアは、キャンセルエラーだけでなく、加算、減算、乗算、除算、ビットシフトの有限数。(近似理論を参照してください。)


4
「数値解析で人間の専門知識を置き換えることは困難です。」-これだけでも+1に値します。
JM

「難しい」は「不可能」と同じものではありません。一部のジョブ(コンパイラライターなど)には「完全雇用定理」があります。数値アナリスト用のものはありますか?
仮名


14

このようなソフトウェアパッケージからどれだけ離れているかを知りたい場合は、Givensの回転を確実かつ効率的計算するための2001 LAPACKワーキングノートを参照してください。数値解析のほとんどの非専門家(および多くの専門家!)が、このような一見単​​純な問題の解決にどれだけの分析が費やされたかに驚かされると思います。

所与、検索C R及びsはCようf,gCcRsC

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

ここで、はユニタリです。信頼性と計算効率、および継続性などのより微妙な問題とのバランスを取ることは非常に重要であり、近い将来自動化されることはほとんどありません。R(c,s)


1
+1これは素晴らしい例です、ありがとう。実数の解が存在する場合、複素数に適応する可能性があります。
ダニエルトレビエン

私はおそらく、基本的な困難はsが複雑になる可能性があるという事実ではなく、不必要なオーバーフローおよび/またはアンダーフローを回避することであることを言及する必要があります。:これは、関数hypot機能に関連しているen.wikipedia.org/wiki/Hypot
ジャックPoulson

11

コード生成と数式のプリコンパイルがより一般的になっています。

SymPy、Mathematica、Mapleのようなシンボリックパッケージにはコード生成が含まれる場合がありますが、それらのいずれも数値について熱心に考えているとは確信がありません。

シンボリックと数値の両方に関心のある他のプロジェクトがいくつかあります。

Theanoは、配列操作を中心としたプロジェクトです。それらは、数値的に悪条件であることが知られているいくつかの操作を識別して置き換えます。これに特定のケースが含まれているかどうかはわかりませんが、検討する価値はあります。

スパイラルもあなたにとって興味深いかもしれません。また、抽象構文ツリーをプリコンパイルし、数値の問題も探します。彼らは(あなたの例のように)スカラー演算にもっと関心があります。ただし、これらは特定のドメインにかなり特化されています。

ただし、この分野の成長は勇気づけられます。数年以内にあなたの質問の答えが良くなると楽観的になるかもしれません。


2
同意した; ドメイン固有の解決策はたくさんあるので、おそらく私の答えは悲観的すぎると思いましたが、一般的な問題は...難しいです。
ジャックポールソン


1

Sageでは、Cython(Cコードを生成するpythonのバリアント)で式を表現できます。ただし、より一般的な質問への回答では、いいえ。ライスの定理を検討してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.