У меня есть структура, представляющая неотрицательное рациональное число p/q:
struct rational {
uint64_t p;
uint64_t q; // invariant: always > 0
};
Я хотел бы умножить свое рациональное число на uint64 n
и получить целочисленный результат, округленный в меньшую сторону. То есть я хотел бы рассчитать:
uint64_t m = (n * r.p)/r.q;
избегая при этом промежуточного переполнения в n * r.p
. (Конечно, окончательный результат может выйти за пределы, что допустимо.)
Как я могу это сделать? Есть ли способ сделать это без высокого умножения?
(Я посмотрел на boost::rational, но, похоже, он не предоставляет эту функцию.)
uint64_t m = (n / r.q) * r.p
? - person dangom   schedule 12.08.2016n / r.q
и приведите его к наименьшей форме, а затем умножьте наr.p
. - person Barmar   schedule 12.08.2016p == n
иp < q
, ноn * p > q
. - person lorro   schedule 12.08.2016