0

在最新的 Boost 中,有一个计算伯努利数的函数,但我错过了它的确切作用。

例如Mathematica,Pythonmpmathwww.bernoulli.org说:

BernoulliB[1] == -1/2

但升压版

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/math/special_functions/bernoulli.hpp>

boost::multiprecision::cpp_dec_float_100 x =  bernoulli_b2n<boost::multiprecision::cpp_dec_float_100>(1);

返回0.166667

为什么会有这种差异?我错过了什么吗?

4

1 回答 1

4

所有奇数伯努利数都是零,除了 B1,你知道是 - 1/2。因此, boost::math::bernoulli_b2n返回唯一的偶数 ( 2nth) 伯努利数。

例如,要让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请注意,这个确切的函数体没有得到很好的验证,并且可能包含错误。但我希望你对如何制作包装器有所了解。

于 2014-09-17T11:10:18.220 回答