我用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? –