5

プロジェクト用に C++ で小さくて不十分な線形代数ライブラリを作成しています (申し訳ありません)。倍精度数を使用して行列と演算を実装しています。私は正しくやっていますか?代わりにテンプレート クラスを実装する必要がありますか? より正確なタイプはありますか?

4

6 に答える 6

6

テンプレートを使用してクラス/構造体を実装します。最初は だけで満足する可能性が高いですが、マトリックスをテンプレートとして実装しなかったすべてのプロジェクトで、後でそれを後悔したことdoubleがわかりました。

また、区間演算、確率分布、複雑な数学、固定小数点一致、部分行列、単純な数学など、より興味深い要素代数を使用する機会も与えられます:-)。

于 2008-12-19T18:00:34.120 に答える
4

テンプレートを使用して C++ 線形代数ライブラリを作成しました。私の考えでは、いつか複素数または拡張精度数を使用したいと思うかもしれません。それはおそらく7年前のことですが、まだ行っていません。ほとんどの場合、テンプレート型として double を使用しており、それを簡単にするための typedef があります。

doubleより小さい型を使用して、逆の方向に進んだことが数回あります。たとえば、ここで説明するメモリ バウンド アプリケーションでは double ではなく float を使用しました。しかし、99.9% の確率でダブルスを使用しています。

テンプレート引数を使用する場合は、整数型を使用していても暗黙的に浮動小数点型が必要になることに注意してください。たとえば、エントリがすべて整数であるマトリックスがあるため、matrix<int> クラスを使用するとします。しかし、それを線形ソルバーに渡します。これで、整数除算を使用して算術が行われ、結果が間違っています。(私はそれをやった!)

于 2008-12-19T18:00:24.867 に答える
4

プロジェクト用に C++ で小さくて不適切な線形代数ライブラリを作成しています (申し訳ありません)。

ああ!注意してください、非常に注意してください... JAMA / TNTをチェックしてください-NISTの承認スタンプがあり、さまざまな因数分解アルゴリズムなど、「より単純な」線形代数数学のいくつかをすでに処理しています。線形代数には、数値精度に関する多くのトリッキーな問題 (ヒルベルト行列など) が含まれており、私が自分のことをするのが好きなのと同じくらい、これは、十分にテストされた優れた強固な基盤を使用したい分野の 1 つです。

それと long double を使用できるはずですが (それについてはよくわかりません)、アルゴリズム自体はおそらく行列の精度よりも重要です。

于 2008-12-19T18:49:45.923 に答える
2

最後の質問の答え: はい、ありlong doubleますdouble。テンプレートを使用するかどうかについては、はい、テンプレートを使用します。それは彼らにとって素晴らしいユースケースであり、他のスカラー数型への移植が容易になると思います。次に、実行しているシステムと、どちらがより速く/よりうまく機能するかに応じて、float および/または double マトリックスを型定義することもできます。

于 2008-12-19T18:03:56.483 に答える
1

自分のために余分な作業を行わないでください。double (または long double) でうまくいく場合は、それを使用してください。

これはほんの小さなプロジェクトのように思えますが、その場合はテンプレートがうまく機能します。

議論されていない別のオプションは、テンプレートを使用して要素タイプを定義することです。余分な作業があったとしてもそれほど多くは発生しませんが、後でいくつかの変更を行うことができます。

于 2008-12-19T18:11:52.380 に答える
0

ハードウェアもサポートしているlong double よりも正確な型は他にありません。ただし、より精度が必要な場合は、独自の型を自由に作成できます。ただし、大規模な最適化を行っても、ネイティブの double 型よりもかなり遅くなります。

于 2008-12-19T18:00:39.297 に答える