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

时间:2015-02-13 03:02:54

标签: c++ boost pi multiprecision

我在mpfr后端使用Boost.Multiprecision包装器,我在创建pi(和e或任何其他数学常量)时遇到了一些麻烦。由于在Boost.Math for constants上使用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吗?

请注意,我需要才能使用变量精度类型,而其他高但固定精度类型则不是选项。我必须能够在运行时动态改变精度。

1 个答案:

答案 0 :(得分:2)

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位数字。你得到的任何数字都可能不正确!)