gmp でいくつかの大きな (128 ~ 256 ビット) 整数を管理しています。1 に近いdouble (0.1 < double < 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;
}
}
どう思いますか教えてください。より堅牢または高速にするための提案はありますか?