1

我正在尝试使用 boost in oder 来计算阶乘。我不知道为什么,但是 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

编辑 :

代码用 double 替换 int:

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

错误信息 :

Erreur 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

Erreur 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

根据关于阶乘的 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,超过了unsigned int(如果 int 为 4 字节长,则为 4294967295)的最大限制。

您必须使用doubleorfloat来计算阶乘。

于 2013-10-23T14:50:38.063 回答