создание математических констант переменной точности с использованием Boost mpfr_float, например pi или e

Я использую Boost.Multiprecision для оберток вокруг бэкэнда mpfr, и у меня возникли некоторые проблемы с созданием pi (и e или любой другой математической константы) с желаемой точностью. Я чувствую, что то, что я хочу сделать, должно быть возможным из-за использования Boost.Math для констант на учебная страница для Boost.Multiprecision. В учебном пособии они используют числа с фиксированной точностью типов, таких как cpp_dec_float_50 — Я хочу сделать это с variable_precision mpfr_float, Проверьте следующий код:

#include <boost/multiprecision/mpfr.hpp>
#include <boost/math/constants/constants.hpp>
#include <iostream>

...
int main() {
boost::multiprecision::mpfr_float::default_precision(1000);
boost::multiprecision::mpfr_float pi = boost::math::constants::pi<boost::multiprecision::mpfr_float>();
std::cout << std::fixed;
std::cout.precision(1000);
std::cout << pi.precision() << " " << pi << std::endl;
}

Результатом является число, pi, который имеет точность 1000, но имеет только ~ 165 цифр числа Пи, о чем свидетельствует результат выходных операторов, которые подтверждают, что мой pi имеет точность 1000 и печатает около 165 правильных цифр и ~ 835 нулей. это явно неправильно.

Возможно ли сделать boost :: multiprecision :: mpfr_float с высокой точностью, заполненный константами boost :: math :: constants?

Обратите внимание, что я необходимость использовать тип переменной точности, и что другие типы с высокой, но фиксированной точностью не являются опцией. Я должен быть в состоянии изменить точность на лету во время выполнения.

0

Решение

Константы, встроенные в заголовки Boost, имеют ограниченную точность, и вы достигли этого предела. Если вам нужна более точная версия pi (например), вам нужно взять ее с собой.

Например, определение boost::math::constants::pi в заголовках есть:

  BOOST_DEFINE_MATH_CONSTANT(pi, 3.141592653589793238462643383279502884e+00, "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00")

https://github.com/boostorg/math/blob/master/include/boost/math/constants/constants.hpp

(Между прочим, это определение дает только 110 цифр после запятой. Любые цифры, которые вы выходите за пределы, могут быть неверными!)

2

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


По вопросам рекламы [email protected]