非負の有理数 p/q を表す構造体があります。
struct rational {
uint64_t p;
uint64_t q; // invariant: always > 0
};
n
有理数に uint64 を掛けて、切り捨てられた整数の結果を得たいと思います。つまり、次のように計算したいと思います。
uint64_t m = (n * r.p)/r.q;
での中間オーバーフローを回避しながらn * r.p
。(もちろん、最終結果はオーバーフローする可能性がありますが、これは許容範囲です。)
これどうやってするの?高倍率なしでそれを行う方法はありますか?
(boost::rational を見ましたが、この機能を提供しているようには見えません。)