Я использую 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?
Обратите внимание, что я необходимость использовать тип переменной точности, и что другие типы с высокой, но фиксированной точностью не являются опцией. Я должен быть в состоянии изменить точность на лету во время выполнения.
Константы, встроенные в заголовки 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 цифр после запятой. Любые цифры, которые вы выходите за пределы, могут быть неверными!)