Я хотел бы рассчитать биномиальный коэффициент как целое число примерно до numberLeaves=100, K=10
. Я считаю, что это должно быть возможно сохранить примерно в 128-битном целом числе.
Поэтому я хотел бы использовать boost::multiprecision::cpp_int
для хранения результата и использовать boost::math::binomial_coefficient<boost::multiprecision::cpp_int>
для его вычисления:
// Invalid because the template argument must be a floating-point type!
boost::multiprecision::cpp_int number_branch_combinations =
boost::math::binomial_coefficient<boost::multiprecision::cpp_int>(numberLeaves, K);
К сожалению, хотя биномиальный коэффициент является целым числом, приведенный выше код недействителен, поскольку boost::math::binomial_coefficient
требует, чтобы возвращаемое значение было типом с плавающей запятой, утверждая, что:
... аргумент шаблона должен быть вещественным типом, таким как float или double, а не целочисленным типом - это слишком легко переполнит!
Как уже отмечалось, в моем случае я ожидаю, что результат вычисления биномиального коэффициента будет соответствовать примерно 128 битам, и мне бы хотелось, чтобы он был целым числом.
Поэтому я решил передать boost::multiprecision::cpp_dec_float
в качестве аргумента шаблона для boost::math::binomial_coefficient
, а затем выполнить преобразование из возвращаемого значения с плавающей запятой (путем округления) в ближайшее целое число.
К сожалению, я не могу найти способ преобразовать boost::multiprecision::cpp_dec_float
в boost::multiprecision::cpp_int
. Похоже, что выполнение преобразования с потерями строго запрещено библиотекой boost::multiprecision
:
cpp_int cppi(2);
cpp_dec_float_50 df(cppi); // OK, int to float
df = static_cast<cpp_dec_float_50>(cppr); // OK, explicit rational to float conversion
// However narrowing and/or implicit conversions always fail:
cppi = df; // Compiler error, conversion not allowed
Сейчас я просто пишу свою собственную функцию для вычисления биномиального коэффициента и возврата значения в виде целого числа.
Мне трудно поверить, что буквально невозможно использовать boost::math::binomial_coefficient
для вычисления биномиального коэффициента и вернуть его как boost::multiprecision::cpp_int
.
Можно ли использовать boost::math::binomial_coefficient
для вычисления биномиального коэффициента и вернуть его как boost::multiprecision::cpp_int
?