【发布时间】:2013-05-27 12:39:13
【问题描述】:
我正在使用 gmp 管理一些大(128~256 位)整数。如果我想将它们相乘成一个 接近 1 (0.1
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;
}
}
你能告诉我你的想法吗?你有什么建议让它更健壮或更快?
【问题讨论】:
-
这是Code Review 的问题,不是 StackOverflow 的问题 :)
-
抱歉,我不知道那个分支。然而,这只是我对一个非常精确的问题的解决方案。请考虑回答一般问题,并最终仅对代码发表评论。谢谢!
-
如果你需要一个近似值,你为什么不把大整数转换成双精度数呢?
-
GMP 支持任意精度的有理数和浮点数。将您的两个值转换为其中一种格式,然后让 GMP 进行乘法运算。
-
您应该查看 MPFR (mpfr.org),它相当于浮点数的 GMP。它与 GMP 一样容易/简单。
标签: c++ c++11 integer double gmp