所有奇数伯努利数都是零,除了 B1,你知道是 - 1/2
。因此,
boost::math::bernoulli_b2n
返回唯一的偶数 ( 2n
th) 伯努利数。
例如,要让B4
您实际通过2
:
std::cout
<< std::setprecision(std::numeric_limits<double>::digits10)
<< boost::math::bernoulli_b2n<double>(2) << std::endl;
如果你通过了1
,你就会得到B2
。
请参阅文档: http: //www.boost.org/doc/libs/1_56_0/libs/math/doc/html/math_toolkit/number_series/bernoulli_numbers.html
当然,您可以制作一个简单的包装器,以模仿首选语法1:
double bernoulli(int n)
{
if (n == 1) return -1.0 / 2.0; // one
if (n % 2) return 0; // odd
return boost::math::bernoulli_b2n<double>(n / 2);
}
int main()
{
std::cout << std::setprecision(std::numeric_limits<double>::digits10);
for (int i = 0; i < 10; ++i)
{
std::cout << "B" << i << "\t" << bernoulli(i) << "\n";
}
}
甚至是超载的班级operator[]
(对于要求苛刻的人;)):
class Bernoulli
{
public:
double operator[](int n)
{
return bernoulli(n);
}
};
甚至使用模板魔法并在编译时进行所有这些检查(我将把它留给读者作为练习;))。
1请注意,这个确切的函数体没有得到很好的验证,并且可能包含错误。但我希望你对如何制作包装器有所了解。