2013-01-31 13 views
6

私は機械intやGMP整数のような汎用整数型で動作するアルゴリズムを使って数学的なソフトウェアを設計しています。パフォーマンスのためには、通常、マシンのintで作業したいと思っていますが、オーバーフローがある場合は、GMPに切り替えることをお勧めします。理想的には実行時に。今のところ、プログラム全体は整数型のテンプレートとして書かれています。図書館が成長するにつれて、痛みは成長する:数学的なソフトウェアで整数型を抽象化する方法

  • コンパイル時間とメモリ消費が手遅れになっています。
  • コンパイル時のエラーメッセージはあまり役に立ちません。
  • デバッグはより苦痛です。
  • コード全体がヘッダファイルにあります。

私は以下の解決策を考えることができます。コンパイル時マクロを介してtypedefされる固定型に依存するようにコードをリファクタリングします。次に、ライブラリの複数のコピーを作成します。各整数型に1つずつ、実行可能ファイルにリンクします。欠点は、私自身がライブラリのインタフェースが必要であると思われることです。

ほとんどのプログラムがタイプに依存する状況のデザインパターンとは何ですか?

+3

GMP(GNU Multiple Precision Arithmetic Library)は、パフォーマンスの点で小さな「int」を扱い、必要に応じてより大きなものにスケーリングするのに非常に優れています。それを改革しようとしないでください! – danodonovan

答えて

4

GNU Multiple Precision Arithmetic Libraryは慎重に小さなオペランドのため、巨大なオペランドの両方、できるだけ速くなるように設計

てきました。

つまり、GMPライブラリを使用すると、これらの問題が処理され、多くの労力を節約できます。

+1

さて、これは複雑さのクラスではありませんが、整数の代わりにgmp整数を使用した場合、同じ問題で3〜4倍長く実行されます。 – Thomas

+0

@Thomas標準の整数を使用しているとき、そのコードは正しいことをしますか? GMPコードが結果の正確さを維持するために数字の内部表現を拡張しなければならない間に、 '標準'コードが常にオーバーフローすると、その違いが説明されます。 – us2012

+0

オーバーフローしません。マシン整数がgmpで十分である状況では、3〜4倍の速度で遅くなります。 – Thomas

2

私自身の数学ソフトウェアでは、デフォルトでGMPを使用しますが、使用できない場合はフォールバックを提供したいと考えています。私はまた、遅いマシンでコンパイルを遅くする巨大なgmpxxヘッダーファイルを楽しんでいませんでした。

私は本質的に未定義の整数(std::aligned_storageを使用しているpimpl)の上にラッパークラスを書きました。コンパイル時にバックエンドを選択できます。

これはテンプレートを削除し、私には十分な柔軟性を与えます。

+0

私はあなたを正しく理解していれば、これは基本的に私がすでに質問した解決策ですか?あなたの実装について少し詳しく説明できますか?私はちょうど 'typedef何かIntegerType'の1つは、コンパイル時にアクティブ化され、IntegerTypeを一貫して使用します。なぜpimplやaligned_storageが必要なのですか? – Thomas

関連する問題