gpt4 book ai didi

c++ - 整数乘以有理数没有中间溢出

转载 作者:可可西里 更新时间:2023-11-01 18:39:28 24 4
gpt4 key购买 nike

我有一个表示非负有理数 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,但它似乎没有提供此功能。)

最佳答案

您可以使用 peasant multiplication :

// requires 0 < c < 2^63
// returns (a * b) / c.
uint64_t multDiv(uint64_t a, uint64_t b, uint64_t c) {
uint64_t rem = 0;
uint64_t res = (a / c) * b;
a = a % c;
// invariant: a_orig * b_orig = (res * c + rem) + a * b
// a < c, rem < c.
while (b != 0) {
if (b & 1) {
rem += a;
if (rem >= c) {
rem -= c;
res++;
}
}
b /= 2;
a *= 2;
if (a >= c) {
a -= c;
res += b;
}
}
return res;
}

关于c++ - 整数乘以有理数没有中间溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38925522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com