我用gmp管理一些大的(128〜256bits)整数。它已经来了一个点,我想他们的倍增接近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;
}
}
你能告诉我你的想法是什么吗?你有任何建议让它更强大或更快?
这是一个问题r [代码审查](http://codereview.stackexchange.com/),不适用于StackOverflow :) – Morwenn
哦,对不起,我不知道那个分支。然而,这只是我解决一个非常精确的问题。请考虑回答一般问题,最终只对代码发表评论。谢谢! – DarioP
如果您需要近似值,为什么不将大整数转换为double? –