2012-03-28 5 views
2

私はBoost.Rational 1.46を使用しています。そのdocumentationブーストで有理数の正規化を避けるには?

最後の基本的な操作は、合理的な正規化です。この操作は、有理数が構築されたとき(または割り当てられたときは)となる度にで実行されます。他のすべての操作は正規化された状態で有理数を維持するように注意します。ノーマライゼーションは、1gcdと2つの部門に相当します。

比較的小さい有理値(したがって小さい整数)を集中的に使用するアプリケーションの場合、正規化は常に高価すぎるためです。これを回避する方法はありますか、特定の瞬間にのみ強制する方法はありますか?

+0

これについて2回考えてください。中間結果は、数回の操作の後で非常に簡単に基礎となる整数型をオーバーフローさせる可能性があるためです。まず、数値(分子と分母)が大きくなるにつれて、方程式を簡略化するために(*最適化が失われる)、より高コストになります*。第2に、複数または無制限の精度整数に切り替えるには、いくつかの操作後にさらに多くのメモリを使用する必要があるため、同じ問題が発生します。とにかく、あなたの経験は何だったのかを知りたいと思っています。 – alfC

+0

これは3年以上前のことでしたが、正規化が不要な用途がありました。さらに、一度乗算するだけでビットを累積することはありません。また、GCCのint128を整数型として使用していましたが、実際の入力はint32なので、オーバーフローなどがないことが保証されていました。しかし、結局、整数算術のみに依存するアルゴリズムを変更することができました。 – Janoma

+0

分母が先験的に限定されていれば、純粋な積分(可能な多項式)演算で問題を解決することは常に可能です。 – alfC

答えて

2

ブースト有理数の不変量は、それらが常に正規化されていることです(あなたの質問に引用されている参考文献を参照)。したがって、正規化されていない有理数を使用する場合は、boost実装を使用することはできません。

+0

さて、はい、私はそれを行う方法を尋ねています。オプションの正規化が良いかもしれませんが、変更されたバージョンは問題ありません。 – Janoma

+2

自分の実装をロールバックすることができます。最初から始めないためには、[この論文](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1718.pdf)([ここから引用] ](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3363.html))。この論文では、正規化を中止する選択肢を持つ合理的なライブラリについて説明します。私はその能力を提供する(他の)ライブラリを知らない。 – Attila

関連する問題