1

階乗を計算するためにブーストを使用しようとしています。理由はわかりませんが、VS2013 でコンパイル エラーが表示されます。

アイデアはありますか?

int nLgCombi = 12;
std::vector<std::string>   NbrToPlay;
...
int ne = NbrToPlay.size();
int calcnc = boost::math::factorial<int>(ne + 1) / boost::math::factorial<int>(nLgCombi);

エラーメッセージ :

Erreur 1 エラー C2338: !boost::is_integral::value d:\users\XXXXXX\downloads\boost_1_55_0b1\boost_1_55_0b1\boost\math\special_functions\factorials.hpp 32 1 APPS

編集 :

コードは int を double に置き換えます:

double dcalcnc = boost::math::factorial<double>(ne +1) / boost::math::factorial<double>(nLgCombi);

エラーメッセージ :

エラー 1 エラー C2039: 'assert_not_arg': n'est pas membre de 'boost::mpl' d:\users\XXXXX\downloads\boost_1_55_0b1\boost_1_55_0b1\boost\mpl\aux_\preprocessed\plain\arg.hpp 45 1

エラー 2 エラー C3861: 'assert_not_arg': identificateur introuvable d:\users\XXXXX\downloads\boost_1_55_0b1\boost_1_55_0b1\boost\mpl\aux_\preprocessed\plain\arg.hpp 45 1

どうもありがとう、

よろしくお願いします、

ニクセウス

4

1 に答える 1

4

factorial に関する Boost のドキュメントによると:

 BOOST_STATIC_ASSERT(!boost::is_integral<T>::value); 
 // factorial<unsigned int>(n) is not implemented 
 // because it would overflow integral type T for too small n 
 // to be useful. Use instead a floating-point type, 
 // and convert to an unsigned type if essential, for example: 
 // unsigned int nfac = static_cast<unsigned int>(factorial<double>(n)); 
 // See factorial documentation for more detail.

intとの階乗バージョンunsigned intはまだ実装されていません。これは、値が小さい場合でもオーバーフローが発生するためです。

たとえば、13 の階乗は 6227020800 であり、これは an の最大制限unsigned int(int が 4 バイト長の場合は 4294967295) を超えています。

階乗を計算するには、doubleまたはを使用する必要があります。float

于 2013-10-23T14:50:38.063 に答える