使用 Boost mpfr_float 创建可变精度的数学常量,例如 pi 或 e

creating math constants of variable precision using Boost mpfr_float, such as pi or e

我正在使用 Boost.Multiprecision 作为 mpfr 后端的包装器,但我在创建 pi(和 e 或任何其他数学常数)达到我想要的精度时遇到了一些问题。我觉得我想做的事情应该是可能的,因为使用了Boost.Math for constants on a tutorial page for 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,正如输出语句的结果所证明的那样,这证实了我的 pi精度为 1000,并打印大约 165 个正确数字和 ~835 个零。这显然是错误的。

是否可以使用 boost::math::constants 中的常量以高精度填充 boost::multiprecision::mpfr_float?

请注意,我需要使用可变精度类型,其他高精度但固定精度的类型不是一个选项。我必须能够在运行时即时更改精度。

Boost headers 中嵌入的常量具有有限的精度,而您已达到该限制。如果您需要 higher-precision 版本的 pi(例如),您需要自己携带。

比如boost::math::constants::pi在headers中的定义是:

  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 位数字。超出这个数字的任何数字都可能不正确!)