私はBoost.Rational 1.46を使用しています。そのdocumentation、ブーストで有理数の正規化を避けるには?
最後の基本的な操作は、合理的な正規化です。この操作は、有理数が構築されたとき(または割り当てられたときは)となる度にで実行されます。他のすべての操作は正規化された状態で有理数を維持するように注意します。ノーマライゼーションは、1gcdと2つの部門に相当します。
比較的小さい有理値(したがって小さい整数)を集中的に使用するアプリケーションの場合、正規化は常に高価すぎるためです。これを回避する方法はありますか、特定の瞬間にのみ強制する方法はありますか?
これについて2回考えてください。中間結果は、数回の操作の後で非常に簡単に基礎となる整数型をオーバーフローさせる可能性があるためです。まず、数値(分子と分母)が大きくなるにつれて、方程式を簡略化するために(*最適化が失われる)、より高コストになります*。第2に、複数または無制限の精度整数に切り替えるには、いくつかの操作後にさらに多くのメモリを使用する必要があるため、同じ問題が発生します。とにかく、あなたの経験は何だったのかを知りたいと思っています。 – alfC
これは3年以上前のことでしたが、正規化が不要な用途がありました。さらに、一度乗算するだけでビットを累積することはありません。また、GCCのint128を整数型として使用していましたが、実際の入力はint32なので、オーバーフローなどがないことが保証されていました。しかし、結局、整数算術のみに依存するアルゴリズムを変更することができました。 – Janoma
分母が先験的に限定されていれば、純粋な積分(可能な多項式)演算で問題を解決することは常に可能です。 – alfC