3

二項係数を までの整数として計算したいと思い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ました

残念ながら、 a から a に変換する方法が見つかりませboost::multiprecision::cpp_dec_floatboost::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ですか?

4

2 に答える 2

1

boost::math::binomial_coefficient二項係数を計算して として返すために使用できる方法が文字通り存在しないとは信じがたいa boost::multiprecision::cpp_intです。

信じがたいと思うのはなぜだと思いますか。

それは明確な設計上の選択であり、そのように文書化されており、当時は非常に理にかなっていました.

Boost Multiprecision は 1_53 でのみ導入されました。それよりも何年も古いと思いますbinomial_coefficient(確認していませんが)。

したがって、嫌悪感を表明する代わりに、ブースト メーリング リストで開発者と話し合って、この新機能を提案する必要があります。Boost ライブラリのメンテナーは通常、(新しい) ライブラリとの統合に非常に熱心です。

お気づきのように、関数をラップして、変換を行うことができます。理想からは外れていますが、Boost Math のパッチを自分で提供するよりも手間がかかりません :)

于 2014-03-27T13:10:23.153 に答える