Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

數學上未定義的函數策略(Mathematically Undefined Function Policies)

有一些函數很通用 (對於所有支持的分佈類型都提供了)但是對於一些特定的分佈可能在數學上沒有定義這些通用的函數。

例如,柯西分佈( Cauchy distribution )就沒有均值,因此下面的代碼應當返回什麼值呢?

mean(cauchy<>());

這種代碼是否都不能通過編譯呢?

缺省的行為是這些函數不能編譯通過-實際上它們將會產生一個靜態斷言(static assertion) -但是通過改變策略我們可以讓這些函數返回一個定義域錯誤(依賴於錯誤處理策略,也可能拋出一個異常)。

這種行為由assert_undefined<> 策略控制:

namespace boost{ namespace math{ namespace policies {

template <bool b>
class assert_undefined;

}}} //namespaces

例如:

#include <boost/math/distributions/cauchy.hpp>

using namespace boost::math::policies;
using namespace boost::math;

// 這種代碼不能通過編譯,柯西分佈沒有均值!
double m1 = mean(cauchy()); 

// 這可以通過編譯,但是會產生一個定義域錯誤!
double m2 = mean(cauchy_distribution<double, policy<assert_undefined<false> > >());

PrevUpHomeNext