実変数の実関数が与えられた場合、IEEE 754算術を搭載したマシンのすべての入力で関数を計算するための数値的に正確なコードを自動的に生成できるソフトウェアはありますか?
たとえば、評価される実関数が次の場合:
ソフトウェアは、致命的なキャンセルと、特定の入力セットの出力テーブル検索を考慮して、計算精度の低下を回避します。
あるいは、純粋なテーブルベースのルックアップルーチンを生成して、特定の関数を高精度で計算できるソフトウェアはありますか?
実変数の実関数が与えられた場合、IEEE 754算術を搭載したマシンのすべての入力で関数を計算するための数値的に正確なコードを自動的に生成できるソフトウェアはありますか?
たとえば、評価される実関数が次の場合:
ソフトウェアは、致命的なキャンセルと、特定の入力セットの出力テーブル検索を考慮して、計算精度の低下を回避します。
あるいは、純粋なテーブルベースのルックアップルーチンを生成して、特定の関数を高精度で計算できるソフトウェアはありますか?
回答:
私が知っている最良の解決策は、Mathematica、Maple、またはSymPyでシンボリック式をプログラムすることです。すべてのリンクは、コード生成ドキュメントに直接移動します。上記のプログラムはすべて、CまたはFortranでコードを生成できます。
上記のプログラムはいずれもIEEE 754算術の精度に言及していません。一般に、@ dmckeeが指摘しているように、壊滅的なキャンセルのすべての原因を予測することは困難です。数値解析で人間の専門知識を置き換えることは困難です。
具体的な例を提供するために任意の入力に対して高精度に三角関数を計算検討。Wikipediaの記事Trigonometric Tablesにあるように、そうするための多くの戦略があり、ハードウェアに依存するものもあります。すべてのアルゴリズムには、ルックアップテーブルやテイラー級数や補間に依存するアルゴリズムも含め、独創性と数値解析が必要です(Wikipediaの記事The Table-Maker's Dilemmaを参照)。詳細については、関連するスタックオーバーフローの質問「三角関数の仕組み」を参照してください。。
任意の関数を高精度で計算するためのコードまたはルーチンを生成したソフトウェアは、キャンセルエラーだけでなく、加算、減算、乗算、除算、ビットシフトの有限数。(近似理論を参照してください。)
このようなソフトウェアパッケージからどれだけ離れているかを知りたい場合は、Givensの回転を確実かつ効率的に計算するための2001 LAPACKワーキングノートを参照してください。数値解析のほとんどの非専門家(および多くの専門家!)が、このような一見単純な問題の解決にどれだけの分析が費やされたかに驚かされると思います。
所与、検索C ∈ R及びsは∈ Cよう
、
ここで、はユニタリです。信頼性と計算効率、および継続性などのより微妙な問題とのバランスを取ることは非常に重要であり、近い将来自動化されることはほとんどありません。
コード生成と数式のプリコンパイルがより一般的になっています。
SymPy、Mathematica、Mapleのようなシンボリックパッケージにはコード生成が含まれる場合がありますが、それらのいずれも数値について熱心に考えているとは確信がありません。
シンボリックと数値の両方に関心のある他のプロジェクトがいくつかあります。
Theanoは、配列操作を中心としたプロジェクトです。それらは、数値的に悪条件であることが知られているいくつかの操作を識別して置き換えます。これに特定のケースが含まれているかどうかはわかりませんが、検討する価値はあります。
スパイラルもあなたにとって興味深いかもしれません。また、抽象構文ツリーをプリコンパイルし、数値の問題も探します。彼らは(あなたの例のように)スカラー演算にもっと関心があります。ただし、これらは特定のドメインにかなり特化されています。
ただし、この分野の成長は勇気づけられます。数年以内にあなたの質問の答えが良くなると楽観的になるかもしれません。
一般的にはありませんが、SymPyのコードジェネレーターの実装者は、= Pでさえ試していません。
Paolo Bientinesiは、線形代数アルゴリズムの安定性証明を生成する方法を開発しました。これは、Robert van de GeijnのFLAME表記を使用して生成されます。
このペーパー、またはより長いワーキングノートバージョンを参照してください。