我正在用 gmp 管理一些大(128~256 位)整数。如果我想将它们乘以接近 1的双精度(0.1 < 双精度 < 10),结果仍然是一个近似整数。我需要做的一个很好的操作示例如下:
int i = 1000000000000000000 * 1.23456789
我在 gmp 文档中进行了搜索,但没有找到用于此功能的函数,因此我最终编写了这段似乎运行良好的代码:
mpz_mult_d(mpz_class & r, const mpz_class & i, double d, int prec=10) {
if (prec > 15) prec=15; //avoids overflows
uint_fast64_t m = (uint_fast64_t) floor(d);
r = i * m;
uint_fast64_t pos=1;
for (uint_fast8_t j=0; j<prec; j++) {
const double posd = (double) pos;
m = ((uint_fast64_t) floor(d * posd * 10.)) -
((uint_fast64_t) floor(d * posd)) * 10;
pos*=10;
r += (i * m) /pos;
}
}
你能告诉我你的想法吗?你有什么建议让它更健壮或更快吗?