Числа Бернулли с Boost отличаются от Mathematica

В последнем Boost есть функция для вычисления числа Бернулли, но я скучаю по тому, что именно он делает.

Например, MathematicaПитон mpmath а также www.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

Почему эта разница? Я что-то пропустил?

0

Решение

Все странно Числа Бернулли равны нулю, кроме 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Обратите внимание, что это точное тело функции не проверено и может содержать ошибки. Но я надеюсь, у вас есть идея, как вы можете сделать обертку.

4

Другие решения